如何在MacPorts gcc 4.5中调试C++ 0x程序?

Mar*_*P S 8 gcc gdb macports debug-symbols c++11

我有一个简单的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在构建过程中有一个bug(似乎gdb正在寻找临时构建目录中的目标文件).

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

当我尝试MacPorts gdb 7.1时,我明白了

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

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

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

Emp*_*ian 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
Run Code Online (Sandbox Code Playgroud)

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


abi*_*gli 5

好了,另一个"绝招",以保持与一个单一的编译和链接步骤将会是添加
-save-temps=obj
到您的g ++命令行,以便

4取出/tmp/[random-string].o和.S

其实有点不执行(实际上最终不得不在你建立随机字符串,而不是目录的规范SOURCE.o和SOURCE.s文件.[OS]在一些临时文件夹,但从点定位调试符号很好