How to check if LLDB loaded debug symbols from shared libraries?
Asked Answered
S

1

11

On Linux I use

(gdb) i shared

in gdb and gdb prints a list of libraries either with a star * if no debug symbols are loaded or without it if loaded, e.g:

0x0000000100c18660  0x0000000100c489a0  Yes (*)     /Users/anon/work/software/webrtc-audio-processing-0.1/build_darwin/../bin/darwin/lib/libwebrtc_audio_processing.0.dylib
0x0000000100c57ca0  0x0000000100c76978  Yes         /Users/anon/work/software/speex/speex/speex-1.2rc2/build_darwin/../bin/darwin/lib/libspeex.1.dylib

I found that in LLDB I should use

(lldb) image list

to do the same. But I get a list of libraries which says nothing to me on whether debug symbols are loaded for the lib or not, e.g:

[181] 19269C1D-EB29-384A-83F3-7DDDEB7D9DAD 0x00007fff8d2d3000 /System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi
[182] 8D7BA9BA-EB36-307A-9119-0B3D9732C953 0x00007fff879ee000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth
[183] 6F03761D-7C3A-3C80-8031-AA1C1AD7C706 0x00007fff92e52000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols

So how do I check if debug symbols are loaded by LLDB?

UPDATE: I just decided to post output of (lldb) image lookup -vn <function> (thanks Jim) for others to know what it looks like:

image lookup -vn Herqq::Upnp::HSsdp::init
2 matches found in libHUpnp.2.dylib:
        Address: libHUpnp.2.dylib[0x00000000000283f0] (libHUpnp.2.dylib.__TEXT.__text + 150384)
        Summary: libHUpnp.2.dylib`Herqq::Upnp::HSsdp::init() at hssdp.cpp:804
         Module: file = "libHUpnp.2.dylib", arch = "x86_64"
    CompileUnit: id = {0x00000000}, file = "/Users/blade/work/software/HUPnP/build-herqq-Desktop_Qt_5_5_0_clang_64bit-Debug/hupnp/../../herqq/hupnp/src/ssdp/hssdp.cpp", language = "c89"
       Function: id = {0xa0002401f}, name = "init", range = [0x00000000000283f0-0x0000000000028511)
       FuncType: id = {0xa0002401f}, decl = hssdp.h:304, clang_type = "_Bool (void)"
         Blocks: id = {0xa0002401f}, range = [0x000283f0-0x00028511)
      LineEntry: [0x00000000000283f0-0x00000000000283ff): /Users/blade/work/software/HUPnP/build-herqq-Desktop_Qt_5_5_0_clang_64bit-Debug/hupnp/../../herqq/hupnp/src/ssdp/hssdp.cpp:804
         Symbol: id = {0x00000c9b}, range = [0x00000000000283f0-0x0000000000028520), name="Herqq::Upnp::HSsdp::init()", mangled="_ZN5Herqq4Upnp5HSsdp4initEv"
       Variable: id = {0xa0002403a}, name = "this", type= "Herqq::Upnp::HSsdp *", location = DW_OP_fbreg(-16), decl =
       Variable: id = {0xa00024047}, name = "herqqLog__", type= "HLogger", location = DW_OP_fbreg(-32), decl = hssdp.cpp:805
       Variable: id = {0xa00024056}, name = "ha", type= "QHostAddress", location = DW_OP_fbreg(-56), decl = hssdp.cpp:812
        Address: libHUpnp.2.dylib[0x0000000000028550] (libHUpnp.2.dylib.__TEXT.__text + 150736)
        Summary: libHUpnp.2.dylib`Herqq::Upnp::HSsdp::init(QHostAddress const&) at hssdp.cpp:817
         Module: file = "libHUpnp.2.dylib", arch = "x86_64"
    CompileUnit: id = {0x00000000}, file = "/Users/blade/work/software/HUPnP/build-herqq-Desktop_Qt_5_5_0_clang_64bit-Debug/hupnp/../../herqq/hupnp/src/ssdp/hssdp.cpp", language = "ISO C++:1998"
       Function: id = {0xa0002408f}, name = "init", range = [0x0000000000028550-0x000000000002862d)
       FuncType: id = {0xa0002408f}, decl = hssdp.h:321, clang_type = "_Bool (const class QHostAddress &)"
         Blocks: id = {0xa0002408f}, range = [0x00028550-0x0002862d)
      LineEntry: [0x0000000000028550-0x0000000000028564): /Users/blade/work/software/HUPnP/build-herqq-Desktop_Qt_5_5_0_clang_64bit-Debug/hupnp/../../herqq/hupnp/src/ssdp/hssdp.cpp:817
         Symbol: id = {0x00000ca3}, range = [0x0000000000028550-0x0000000000028630), name="Herqq::Upnp::HSsdp::init(QHostAddress const&)", mangled="_ZN5Herqq4Upnp5HSsdp4initERK12QHostAddress"
       Variable: id = {0xa000240aa}, name = "this", type= "Herqq::Upnp::HSsdp *", location = DW_OP_fbreg(-16), decl =
       Variable: id = {0xa000240b7}, name = "unicastAddress", type= "const QHostAddress &", location = DW_OP_fbreg(-24), decl = hssdp.cpp:816
       Variable: id = {0xa000240c6}, name = "herqqLog__", type= "HLogger", location = DW_OP_fbreg(-40), decl = hssdp.cpp:818
Shimberg answered 17/10, 2016 at 12:18 Comment(2)
Now this question is also answered in official LDDB documentation in "Troubleshooting LLDB" section, please see "How do I check if I have debug symbols?": https://lldb.llvm.org/troubleshooting.html It gives a slightly different approach, even though the approach from the accepted answer worked quite fine for me.Keely
Note, the link in the above comment is now: lldb.llvm.org/use/troubleshooting.htmlIzy
T
14

If your binary was built with a dSYM, then the dSYM will show up on the line after the binary's listing in image list.

There isn't an easy way to do this if the binary is using the "leave the debug information in the .o file" style which is the default for the Debug configuration in Xcode. I filed a bug to make that easier to see.

One fairly simple way to do it is:

(lldb) image lookup -vn <SomeFunctionNameThatShouldHaveDebugInfo>

If the output of that command includes a CompileUnit, then the .o file containing that function has debug information, otherwise, not.

Thanhthank answered 19/10, 2016 at 0:55 Comment(3)
thank you for your help. It seems like my library has the debug info and lldb loaded it, so I don't see sources due to some other reasons.Shimberg
The file path to the source file listed in the CompileUnit line of the image lookup output is the one we get from the debug information. Does that match the actual location of the sources on the machine you're using to debug?Thanhthank
If there are some functions with the same name in different images (such as load and save ), you can limit the search range by adding the <fileAbsolutePath> argument, like this: (lldb) image lookup -vn <func> <fileAbsolutePath> . Execute (lldb) help image lookup for details.Jarvey

© 2022 - 2024 — McMap. All rights reserved.