amccarth marked 3 inline comments as done.
amccarth added a comment.

I backed out the TODO and the warn-and-continue behavior to expedite this patch 
which is just supposed to be a refactor for readability.

We can revisit the issue of debug symbol file names not matching the object 
file names in the future (if necessary).



================
Comment at: lldb/source/Commands/CommandObjectTarget.cpp:4103
+    // this point.
+    // TODO:  Is this part worthwhile?  `foo.exe` will never match `foo.pdb`
+    if (matching_modules.IsEmpty())
----------------
labath wrote:
> amccarth wrote:
> > labath wrote:
> > > This is not unreasonable in the non-pdb world. You can have a stripped 
> > > version of a file somewhere prepared for deployment to some device (or 
> > > downloaded from the device), and then you'll also have an unstripped 
> > > version of that file (with the same name) in some build folder.
> > Sure, if you've got two files with the same name in two directories that's 
> > fine.
> > 
> > But the loop tries peeling the extension off of the supplied file name and 
> > comparing it to the target's file name.  I guess it's trying to match 
> > something like `foo.unstripped` to `foo`.  Is that a typical thing?
> Ah, sorry, I missed that part.
> 
> Yes, this is also thing that's used sometimes (probably even more often than 
> the first thing). One of the conventions for automatically finding [[ 
> https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html | 
> separate debug files ]] involves appending `.debug` to your file and then 
> placing it in a special folder. I guess this was added to enable one to do 
> "target symbols add /whereever/foo.debug" and have it match "foo".
> 
> That said, stripping the extension in a loop does seem like overkill.
OK, I'm removing the TODO in favor of a comment with the `foo` and `foo.debug` 
you gave.  Whether it should be a loop or not can be addressed later.  Whether 
we should do something that would also work for Windows (e.g., `foo.exe` 
matching `foo.pdb`) can also be considered later.

This patch is just supposed to be a refactor for readability/debuggability.


================
Comment at: lldb/source/Commands/CommandObjectTarget.cpp:4175-4178
+    if (object_file->GetFileSpec() != symbol_fspec) {
+      result.AppendWarning("there is a discrepancy between the module file "
+                           "spec and the symbol file spec\n");
+    }
----------------
labath wrote:
> amccarth wrote:
> > clayborg wrote:
> > > amccarth wrote:
> > > > amccarth wrote:
> > > > > clayborg wrote:
> > > > > > labath wrote:
> > > > > > > This part is not good. Everywhere else except pdbs this means 
> > > > > > > that we were in fact unable to load the symbol file. What happens 
> > > > > > > is that if we cannot load the object file representing the symbol 
> > > > > > > file (at [[ 
> > > > > > > https://github.com/llvm/llvm-project/blob/master/lldb/source/Symbol/SymbolVendor.cpp#L48
> > > > > > >  | SymbolVendor.cpp:48 ]]), we fall back to creating a SymbolFile 
> > > > > > > using the object file of the original module (line 52).
> > > > > > > 
> > > > > > > The effect of that is that the symbol file creation will always 
> > > > > > > succeed, the previous checks are more-or-less useless, and the 
> > > > > > > only way to check if we are really using the symbols from the 
> > > > > > > file the user specified is to compare the file specs.
> > > > > > > 
> > > > > > > Now, PDB symbol files are abusing this fallback, and reading the 
> > > > > > > symbols from the pdb files even though they were in fact asked to 
> > > > > > > read them from the executable file. This is why this may sound 
> > > > > > > like a "discrepancy" coming from the pdb world, but everywhere 
> > > > > > > else this just means that the symbol file was not actually loaded.
> > > > > > This could also fail if the symbol file spec was a bundle which got 
> > > > > > resolved when the module was loaded. If the user specified 
> > > > > > "/path/to/foo.dSYM" and the underlying code was able to resolve the 
> > > > > > symbol file in the dSYM bundle to 
> > > > > > "/path/to/foo.dSYM/Contents/Resources/DWARF/foo".
> > > > > Interesting.  I did not expect that fallback behavior from the API.
> > > > > 
> > > > > > PDB symbol files are abusing this fallback
> > > > > 
> > > > > I'm not sure there's abuse going on here.  I'm not understanding 
> > > > > something about how lldb models this situation.  Consider the case 
> > > > > where the user explicitly asks lldb to load symbols from a PDB:
> > > > > 
> > > > >     (lldb) target add symbols D:\my_symbols\foo.pdb
> > > > > 
> > > > > Then `symbol_file` is the PDB and `object_file` is the executable or 
> > > > > DLL.  I would expect those file specs to match only in the case where 
> > > > > the symbols are in the binary (in other words, when symbol file and 
> > > > > object file are the same file).  Even ignoring the PDB case, it seems 
> > > > > this wouldn't even work in the case you mentioned above where the 
> > > > > object file is stripped and the symbol file is an unstripped copy of 
> > > > > the object file (possibly with a different name).  You can also get 
> > > > > here if the symbols were matched by UUID rather than file spec.  Or 
> > > > > when the symbols were matched by the basename minus some extension.
> > > > > 
> > > > > Given that dsyms work, I must be misunderstanding something here.  
> > > > > Can you help me understand?
> > > > > 
> > > > > What's the right thing to do here?  If I just undo this refactor, 
> > > > > then we're back to silent failures when the symbols exist in a 
> > > > > different file than the object.
> > > > In your example, the file specs do not match.
> > > > 
> > > > 1. The old code would therefore reject the symbol file and return an 
> > > > error.
> > > > 2. The new code would therefore emit a warning but proceed with the 
> > > > selected symbol file and return success.
> > > > 
> > > > Do you want either of these behaviors or something else?
> > > all I know is I can and have typed:
> > > ```
> > > (lldb) target symbols add /path/to/foo.dSYM
> > > ```
> > > And it would successfully associate it with the binary, probably because 
> > > the code on 4071 would see a UUID and accept it before it gets to this 
> > > point. 
> > > 
> > > What is the point of the warning? When would this happen?
> > There are examples in the thread with Pavel just below this thread.  On 
> > Windows, your symbols may come from a file called `foo.pdb` for an 
> > executable called `foo.exe`.  The old code would successfully load the PDB 
> > file, then decide it was no good because the file specs don't match.  
> > (Heck, at this point, we've just gone through a bunch of gyrations to allow 
> > matching of differing file specs.)  So you'd get a mostly silent failure 
> > for code that actually worked.
> > 
> > My intent was to simply warn about such cases without actually forcing a 
> > failure, and to do so with some explicit feedback so that the user 
> > understands.
> > 
> > I'll wait to hear what Pavel says.  If necessary, I'll just roll back this 
> > part of the change (so that this remains just a refactor), and I'll figure 
> > out a way around the problem in a later patch.
> Greg's use case will work because the bundle path will be resolved to the 
> actual file (in PlatformDarwin::ResolveSymbolFile) before we get to this 
> place.
> 
> Overall, I think changing this to a warning would be acceptable. Thinking 
> about this more, I am not sure if the scenario I described below could happen 
> (easily -- it might for some very weird elf files where we were able to 
> extract the uuid, but cannot create an actual ObjectFileELF instance). So 
> calling this a discrepancy would be fine.
> 
> And I do think that the current pdb behavior is a big discrepancy, which 
> should be fixed. Either we should go the breakpad way, and introduce an 
> "ObjectFilePDB" so that the pdb symbol file plugin(s) can behave like the 
> dwarf code does, or we should change the SymbolFile class so that it does not 
> require an object file instance in order to read symbols from a separate file 
> (and then we can delete ObjectFileBreakpad).
> 
> Having a more explicit method of checking whether the symbol file creation 
> was successful (instead of checking file specs) would not hurt either...
Thanks for all the clarification.

I am planning to introduce an ObjectFilePDB in a future patch to solve other 
problems.

To keep this patch a behavior-preserving refactor, I'll back out the warning 
message.  Once PDBs can be loaded reliably, I can circle back here to see if 
there's a better way to detect failure and/or to communicate matching problems 
to the user.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73594/new/

https://reviews.llvm.org/D73594



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to