【发布时间】:2014-04-07 11:28:19
【问题描述】:
目标是在库深处调试方法。
我们可以在同一个库中调试 c 函数(只要它们不在 .m 文件中),但显然没有 Objective-C 代码,甚至没有任何 .m 文件中的 c 代码。
当我尝试手动设置断点 (break set -n) 时,我得到:
WARNING: Unable to resolve breakpoint to any actual locations.
代码确实被调用了,可靠的记录器确认了这一点。
我的预感是调试信息在此过程中会丢失:我们正在构建一个静态库,然后是另一个静态库(“框架”样式),最后我们将其链接到我们的应用程序中。是的,这很复杂,但历史原因,你知道的。
我试图检查第一个 .a 文件以查看发生了什么,但是当我尝试将其加载到 lldb 时,我必须创建一个目标。任一架构的目标创建都失败:
target create -d --arch i386 libFoo.a
error: 'libFoo.a' doesn't contain the architecture i386
target create -d --arch armv7 libFoo.a
error: 'libFoo.a' doesn't contain any 'remote-ios' platform architectures: arm64, armv7, armv7f, armv7k, armv7s, armv7m, armv7em, armv6m, armv6, armv5, armv4, arm, thumbv7, thumbv7k, thumbv7s, thumbv7f, thumbv7m, thumbv7em, thumbv6m, thumbv6, thumbv5, thumbv4t, thumb
lipo -info libFoo.a
Architectures in the fat file: libFoo.a are: armv7 i386
有没有人知道如何最好地解决这个问题?代码肯定是链接的,可以工作,但是lldb不能设置断点。
非常感谢
附录:
我创建了我能想到的最简单的设置,但我看到了非常非常奇怪的结果:
如果我尝试查找某些内容,有些会返回文件和行号,有些则不会:
image lookup -s Foo::faz()
1 symbols match 'Foo::faz()' in […]/Build/Products/Debug-iphoneos/Test.app/Test:
Address: Test[0x00010334] (Test.__TEXT.__text + 22060)
Summary: Test'Foo::faz() at Foo.cpp:858
image lookup -s FazBar
1 symbols match 'FazBar' in […]/Build/Products/Debug-iphoneos/Test.app/Test:
Address: Test[0x00038eb4] (Test.__TEXT.__text + 188844)
Summary: Test'FazBar
尝试在相应文件中设置断点会产生预期的结果:
(lldb) break set -f Foo.cpp -l 877
Breakpoint 5: where = Test'Foo::faz() + 76 at Foo.cpp:877, address = 0x000cb380
(lldb) break set -f bar.c -l 585
Breakpoint 6: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
如何深入了解 .a 文件以查看为什么找不到某些文件?
【问题讨论】:
-
你是否使用异常断点
-
不,常规断点
-
fwiw 我认为
target create -d --arch i386 libFoo.a不会在 lldb 中工作 - 这与您的调试信息是否打开无关。这些被称为“静态库”(实际上是ranlib 档案)——它们就像.o文件的压缩包,而不是单个二进制文件。 lldb 不会接受它们作为二进制图像。您可以在.o文件、.dylib、可执行文件、应用程序、捆绑包等上运行 lldb,但我认为没有人让它接受 ranlib 档案。没有技术原因无法完成; lldb 基本上会将所有.o文件作为单独的二进制文件加载。