c++ - GCC 调试器堆栈跟踪显示错误的文件名和行号

标签 c++ gcc gdb

我正在尝试将一个相当大的 C++ 项目移植到 Mac OS X 上使用 g++ 4.0。我的项目编译没有错误,但我无法让 GDB 正常工作。当我通过在 GDB 命令行中键入“bt”查看堆栈时,显示的所有文件名和行号都是错误的。

例如,根据 GDB 堆栈跟踪,我的 main() 函数应该在 Mac OS X SDK 的 stdexcept 中,这没有任何意义。

什么会导致 GDB 故障如此严重?我已经检查了代码中的#line 和#file 语句,并确保代码只有 unix 行结尾。我还清理并重建了项目。我也试过调试一个 Hello World 项目,那个项目没有遇到同样的问题。

问题是否与我正在链接的第三方库之一以及这些库的编译方式有关?还是完全不同的东西?

这里是对 gccld 的两个示例调用,由 Xcode 执行。 . AFAIK 我项目中的所有 cpp 文件都使用相同的参数进行编译和链接。

/Developer/usr/bin/gcc-4.0 -x c++ -arch i386 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -fpermissive -Wreturn-type -Wunused-variable -DNO_BASS_SOUND -D_DEBUG -DXCODE -D__WXMAC__ -isysroot /Developer/SDKs/MacOSX10.5.sdk -mfix-and-continue -fvisibility-inlines-hidden -mmacosx-version-min=10.4 -gdwarf-2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXDEBUG__ -D__WXMAC__ -c "/Users/adriangrigore/Documents/Gemsweeper Mac/TSDLGameBase.cpp" -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Gemsweeper Mac.build/Debug/Gemsweeper Mac.build/Objects-normal/i386/TSDLGameBase.o"

/Developer/usr/bin/g++-4.0 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk "-L/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug" -L/Developer/SDKs/MacOSX10.5.sdk/usr/local/lib -L/opt/local/lib "-F/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug" -F/Users/adriangrigore/Library/Frameworks -F/Developer/SDKs/MacOSX10.5.sdk/Library/Frameworks -filelist "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Gemsweeper Mac.build/Debug/Gemsweeper Mac.build/Objects-normal/i386/Gemsweeper Mac.LinkFileList" -mmacosx-version-min=10.4 /opt/local/lib/libboost_program_options-mt.a /opt/local/lib/libboost_filesystem-mt.a /opt/local/lib/libboost_serialization-mt.a /opt/local/lib/libboost_system-mt.a /opt/local/lib/libboost_thread-mt.a "/Users/adriangrigore/Documents/Gemsweeper Mac/3rd party/FreeImage/Dist/libfreeimage.a" "/Users/adriangrigore/Documents/Gemsweeper Mac/3rd party/cpuinfo-1.0/libcpuinfo.a" -L/usr/local/lib -framework IOKit -framework Carbon -framework Cocoa -framework System -framework QuickTime -framework OpenGL -framework AGL -lwx_macd_richtext-2.8 -lwx_macd_aui-2.8 -lwx_macd_xrc-2.8 -lwx_macd_qa-2.8 -lwx_macd_html-2.8 -lwx_macd_adv-2.8 -lwx_macd_core-2.8 -lwx_base_carbond_xml-2.8 -lwx_base_carbond_net-2.8 -lwx_base_carbond-2.8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS/Gemsweeper Mac"

请注意,我已经问过一个关于 Xcode 调试器的类似问题 here , 但我正在重新发布,因为我刚刚了解到这实际上不是 Xcode 的错,而是 GCC/ld/GDB 的问题。

编辑:我的项目使用了以下第三方库:SDL , Boost , wxWidgets .我不确定这对这个问题是否重要,但我只是想提一下以防万一。

我试过编译 Xcode SDL 项目模板并没有遇到同样的问题,所以这一定是由于我的项目中有一些特殊的东西。

第二次编辑:正如我刚刚发现的,我在搜索带有字符串“This is an automatically generated”的文件时犯了一个错误。我刚刚找到了几十个具有相同字符串的文件,都属于 FreeImage ,我正在使用的第三方库之一。所以,问题似乎与 FreeImage 有关,但我仍然不确定如何进行。

最佳答案

当我的 gdb 版本与我的 g++ 版本不匹配时,我出现了这些症状。

尝试获取最新的 gdb。

关于c++ - GCC 调试器堆栈跟踪显示错误的文件名和行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594782/

相关文章:

c++ - 将模板函数传递给 std::for_each

C++ std::nextbefore 函数?

c++ - C++ 中的内联 throw() 方法

c++ - glibcxx STL 在其 std::valarray::sum() 的实现中是否不正确?

c - 使用 gdb 调试 C 预处理器宏中的崩溃

c++ - 如何将非托管 double 型转换为托管字符串?

c++ - 从线扫描相机显示线图像的最快算法或方法是什么

c++ - gcc 中的默认构造内联静态随机数引擎

当只有一个观察点时,gdb 会因太多观察点而停止

bash - 为什么 '<<<' 会过滤 gdb 中的空字节,而 '<()' 不会?