如何检查LLDB是否从共享库中加载了调试符号?

717

在Linux上,我使用

(gdb) i shared

在gdb和gdb中,*如果没有加载调试符号,则用星号打印一个库列表,如果加载则不带库的列表,例如:

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

我发现在LLDB中我应该使用

(lldb) image list

做同样的事情。但是我得到了一个库列表,它对是否为lib加载调试符号没有任何帮助,例如:

[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

那么,如何检查LLDB是否加载了调试符号?

更新:我只是决定将(lldb) image lookup -vn <function>(感谢吉姆)的输出发布给其他人,以了解它的外观:

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
吉姆·英厄姆(Jim Ingham)

如果您的二进制文件是使用dSYM构建的,则dSYM将显示在二进制文件在图像列表中列出的行之后。

如果二进制文件使用“将调试信息保留在.o文件中”样式(这是Xcode中的Debug配置的默认样式),则没有简单的方法。我提交了一个错误使它更容易看到。

一种相当简单的方法是:

(lldb) image lookup -vn <SomeFunctionNameThatShouldHaveDebugInfo>

如果该命令的输出包括CompileUnit,则包含该函数的.o文件具有调试信息,否则,则没有调试信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法加载linux-vdso.so.1的共享库符号。在调试时

如何检查是否使用LD_PRELOAD预先加载了Linux共享库

如何知道给定的共享库是否使用调试符号构建?

是否动态加载Linux共享库?

如何使dlopen加载的共享库中的gdb打印符号?

如何使用Eclipse检查调试符号状态?

在R中加载链接到Rust库的共享库

如何检查webView是否已在Android中加载下一页?

在dlopen打开另一个C库的Python中加载C库-未解析的共享符号

即使加载了调试符号,GDB进入共享库的过程仍显示“没有此类文件”

如何检查链接是否在同一域中?然后在同一标签中加载链接

如何检测是否需要共享库符号链接?

如何使用urllib检查页面内容是否已在Python中加载?

如何检查是否安装了共享库?

如何使用JavaScript在Illustrator中加载符号库?

如何防止GDB为(大型)库加载调试符号?

如何在雷鸟中加载自己的pkcs#11共享库

如何延迟在Android中加载共享库

如何使用GDB调试共享库?

在sudo中加载共享库时出错

add_qt_android_apk剥离共享库的调试符号

使用 LLDB 加载 ctypes 的调试库

如何调试无法在 Windows 10 中加载的 Visio 加载项

检查 UIWebView 是否在 Swift 中加载完成

ctype 加载的共享库符号也在 glibc 中定义;如何选择符号?

如何从 C 静态库中分离调试符号,然后将其加载到 GDB 中

如何检查图像是否在 Vue/Nuxt 中加载?

在 GDB 会话中加载共享库

检查共享库是否与 -Bsymbolic 链接