8

我有一个要调试的简单 c++ 程序,但 gdb 找不到库的目标文件(或没有可用的调试信息),而且它似乎也找不到我的可执行文件的调试符号。

我在 OSX 10.5.8 上,带有 macports,我用

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -I/opt/local/include -L/opt/local/lib -lgsl -static-libstdc++ MCMC-simplex.cpp -o mcmc

(只有一个文件,g++-mp-4.5 是 gcc/g++ 4.5 的 macports 可执行文件)

当我尝试在生成的可执行文件上运行 gdb 时,我收到许多表单的错误消息(在启动时)

警告:找不到目标文件“/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2_s.o” - 没有可用于“.. /../../gcc-4.5.0/libgcc/../gcc/config/soft-fp/trunctfdf2.c”。

对我来说,这表明 macports 在其构建过程中存在错误(似乎 gdb 正在临时构建目录中寻找目标文件)。

我应该补充一点,当我尝试在 gdb(Apple 提供的那个)中查看我的程序列表时,它会尝试在 中查找一个随机.s文件/var/tmp,这对我来说听起来像是一个汇编文件。这就是为什么我说它似乎也无法为我的程序找到调试符号。

当我尝试 MacPorts gdb 7.1 时,我得到

警告:`/var/folders/Xa/XaqHO9PeEC8K-Nrd0L9xWk+++TM/-Tmp-//cc2IvFto.o':无法打开以读取符号:没有这样的文件或目录。(未找到调试符号)...完成。

并且 Apple 的 gdb 给出的许多错误消息都没有(尽管最终结果是相同的)。

有没有人遇到过这个问题,并提出了解决方案?

4

3 回答 3

11

与其他 UNIXen 不同,在 MacOS 上,调试信息未链接到可执行文件中。相反,可执行文件有一个链接到其中的目标文件列表,调试器在这些单独的目标文件中查找调试信息。

如果删除目标文件,则无法调试。

当您在“单步”中编译和链接可执行文件时,GCC 会执行以下操作:

  1. 创建装配文件/tmp/[random-string].s
  2. 组装成/tmp/[random-string].o
  3. /tmp/[random-string].ocrt0.o,libc等链接到mcmc可执行文件中。
  4. 删除/tmp/[random-string].o.s

这是阻止您调试的最后一步。

解决方案:

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -c MCMC-simplex.cpp
g++-mp-4.5 MCMC-simplex.o -lgsl -static-libstdc++ -o mcmc

这将保留MCMC-simplex.o在当前目录中,并允许 GDB 在其中找到调试信息。

于 2010-07-31T03:02:46.007 回答
5

好吧,继续执行单个编译和链接步骤的另一个“技巧”是添加
-save-temps=obj
到您的 g++ 命令行,以便

4 删除 /tmp/[随机字符串].o 和 .s

实际上有点没有执行(实际上你最终在你正在构建的目录中拥有规范的 SOURCE.o 和 SOURCE.s 文件,而不是在某些临时文件夹中的 RANDOM-STRING.[os] ,但从角度来看定位调试符号很好

于 2010-11-12T12:21:46.360 回答
2

在我看来,您有两个问题:1)可执行文件没有调试符号,2)某些生成警告的共享库没有调试符号。我也有问题2)。受雇的俄罗斯人回答了 1) 并为我指出了正确的方向 2)。

首先,如果您不需要调试警告中提到的库,则可以安全地忽略它们。但当然,这些警告很烦人,并且可能隐藏其他问题。在您和我的情况下,MacPorts 安装的库应该已经剥离了调试符号,但没有。正如 Employed Russian 所说,导致警告的原因是符号本身保存在构建过程中生成的目标文件中,而不是安装的库中。库将指向目标文件的指针存储为它们(最小)调试信息的一部分。

您可以使用 strings 命令验证这一点。如果您在加载 libsomething.dylib 时收到 /crazy/path/to/something.o 的警告:

strings - libsomething.dylib | grep something.o

请注意,您需要“-”(这是我第一次遇到的问题)。

要修复它,请像这样剥离调试信息:

strip -S libsomething.dylib

之后,“dwarfdump --file-stats libsomething.dylib”应该显示“STABS 调试”部分为空。(目标文件的链接以 STABS 调试格式存储。)

没有更多丑陋的警告......耶!

那太难了

于 2011-04-08T03:12:53.103 回答