【问题标题】:Why can't I set a breakpoint in my library?为什么我不能在我的库中设置断点?
【发布时间】: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 文件作为单独的二进制文件加载。

标签: ios xcode lldb


【解决方案1】:

嗯,有人(实际上不是我,有绝对聪明的设置 GCC_GENERATE_DEBUGGING_SYMBOLS = NO 隐藏在深处的某个地方。

设置为yes,好吧,你猜对了,解决了问题

亚历克斯

【讨论】:

    【解决方案2】:

    像上面一样设置异常断点

    去断点导航点击+并选择添加异常断点

    【讨论】:

    • 我不确定这对我有什么帮助。为什么我需要在异常上设置断点?或者你的意思是我应该抛出异常?
    【解决方案3】:

    尝试使用 DYLD_BIND_AT_LOAD 环境变量集。这应该禁用惰性绑定,这通常无法命中符号中断

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2017-04-05
      • 2020-08-31
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多