#c #macos #debugging #lldb #debug-symbols
#c #macos #отладка #lldb #debug-символы
Вопрос:
В 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
чтобы сделать то же самое. Но я получаю список библиотек, который мне ничего не говорит о том, загружены ли отладочные символы для библиотеки или нет, например:
[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 constamp;) 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 amp;)"
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 constamp;)", 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 amp;", 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
Комментарии:
1. Теперь ответ на этот вопрос также содержится в официальной документации LDDB в разделе «Устранение неполадок LLDB», см. «Как мне проверить, есть ли у меня отладочные символы?»: https://lldb.llvm.org/troubleshooting.html Это дает несколько иной подход, хотя подход из принятого ответа сработал для меня вполне нормально.
2. Обратите внимание, что ссылка в приведенном выше комментарии теперь: lldb.llvm.org/use/troubleshooting.html
Ответ №1:
Если ваш двоичный файл был собран с помощью dSYM, то dSYM будет отображаться в строке после списка двоичных файлов в списке изображений.
Нет простого способа сделать это, если двоичный файл использует стиль «оставьте отладочную информацию в файле .o», который является стандартным для конфигурации отладки в Xcode. Я внес ошибку, чтобы ее было легче увидеть.
Один довольно простой способ сделать это:
(lldb) image lookup -vn <SomeFunctionNameThatShouldHaveDebugInfo>
Если выходные данные этой команды включают CompileUnit , то файл .o, содержащий эту функцию, содержит отладочную информацию, в противном случае нет.
Комментарии:
1. спасибо за вашу помощь. Похоже, что в моей библиотеке есть отладочная информация, и lldb загрузил ее, поэтому я не вижу источников по некоторым другим причинам.
2. Путь к исходному файлу, указанный в строке CompileUnit вывода поиска изображения, является тем, который мы получаем из отладочной информации. Соответствует ли это фактическому расположению источников на компьютере, который вы используете для отладки?
3. Если в разных изображениях есть несколько функций с одинаковыми именами (например,
load
иsave
), вы можете ограничить диапазон поиска, добавив<fileAbsolutePath>
аргумент, например:(lldb) image lookup -vn <func> <fileAbsolutePath>
. Execute(lldb) help image lookup
для получения подробной информации.