代码之家  ›  专栏  ›  技术社区  ›  Marcus P S

我如何调试McPosiGCC 4.5中的C++ 0x程序?

  •  8
  • Marcus P S  · 技术社区  · 15 年前

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

    我在OSX10.5.8上,使用macports,我用

    g++-mp-4.5-墙-迂腐-std=c++0x-g-ggdb-I/opt/local/include-L/opt/local/lib-lgsl

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

    警告:找不到对象文件“/opt/local/var/macports/build/\u opt\u local\u var\u macports\u sources\u rsync.macports.org\u release\u ports\u lang\u gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2\u s.o”-没有“../../../../gcc-4.5.0/libgcc/../gcc/config/soft fp/trunctfdf2.c”的调试信息。

    在我看来,这表明macports在构建过程中有一个bug(看起来gdb正在临时构建目录中查找对象文件)。

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

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

    苹果gdb发布的众多错误信息中没有一条(尽管最终结果是一样的)。

    3 回复  |  直到 15 年前
        1
  •  5
  •   abigagli    15 年前

    好吧,另一个“诀窍”继续进行一个编译和链接步骤将是添加
    -save-temps=obj
    到您的g++命令行

    4删除/tmp/[random string].o和.s

        2
  •  11
  •   Employed Russian    15 年前

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

    如果删除对象文件,则无法调试。

    1. 创建程序集文件 /tmp/[random-string].s
    2. 把它组装成 /tmp/[random-string].o
    3. /tmp/[随机字符串].o 具有 crt0.o libc mcmc
    4. 删除 /tmp/[随机字符串].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

        3
  •  2
  •   Tyler Daniel    14 年前

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

    首先,如果您不需要调试警告中提到的库,那么可以安全地忽略它们。当然,这些警告很烦人,可能会掩盖其他问题。在你我的例子中,MacPorts安装的库应该去掉调试符号,但是没有。正如俄罗斯人所说,引起警告的原因是,符号本身保存在生成过程中生成的对象文件中,而不是安装在库中。这些库存储指向对象文件的指针,作为它们(最小)调试信息的一部分。

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

    strings - libsomething.dylib | grep something.o
    

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

    要修复它,请剥离调试信息,如下所示:

    strip -S libsomething.dylib
    

    之后,'dwarfdump--file stats libsomething.dylib'应该显示“STABS debug”部分为空(指向对象文件的链接以STABS debug格式存储。)

    别再发出难听的警告了。。耶!

    那是 太难了。

    推荐文章