gdb 7.5.1 调试通过 g 4.7.2 构建的可执行文件的问题

Posted

技术标签:

【中文标题】gdb 7.5.1 调试通过 g 4.7.2 构建的可执行文件的问题【英文标题】:Problems with gdb 7.5.1 debugging executable built via g 4.7.2 【发布时间】:2012-12-12 16:03:46 【问题描述】:

我一直在更新我的 Mac 工具链,以便利用 C++11 功能并最终获得 STL 数据结构的漂亮打印调试。我使用 Homebrew 构建 gcc 4.7.2 编译器。我已经能够使用这个新编译器重新编译我当前项目的源代码。然而,我尝试过的所有版本的 gdb 在设置断点、查看源代码或查看局部变量时都会出现各种问题。

我认为作为 Xcode 命令行工具的一部分安装的 gdb 版本 6.3.50 无法显示各种基于模板的变量。我还构建并尝试使用其他几个 gdb 版本(7.3.1、7.4.1 和 7.5.1),但每个 gdb 版本都存在一些问题,难以设置断点、查看源代码和查看变量。具体来说,这些 gdb 版本不知道头文件中定义的函数的源文件或行号,这些头文件函数中无法设置断点,并且许多局部变量已被“优化”出来。

是否有其他人遇到过这些问题,如果有,您是否能够解决这些问题?为了避免这些问题,我应该在我的工具链中使用哪些版本?

为了记录,我的开发是在最近的 MBP 上运行最新的 Mountain Lion 更新。我的 IDE 是带有 CDT 版本 8.1.1 的 Eclipse Juno。而且,是的,我已经对我构建并尝试使用的所有 gdb 版本进行了代码签名。

感谢您的任何意见,

鲍勃

【问题讨论】:

【参考方案1】:

许多局部变量已被“优化”。

调试优化代码时会发生这种情况吗?如果是这样,那是预期的。您以前可能没有见过这种情况,因为旧的 GCC 并没有优化那么多。

修复:使用-g -O0 标志构建待调试代码。

【讨论】:

我正在使用 -g3 和 -O0 进行编译,但即使在那些引用数据成员的方法中,像“this”指针这样的变量也会被 gdb 优化。但另一个大挑战是 gdb 似乎没有头文件中定义的方法的源文件和行号信息。所以我不能设置断点或单步执行。 或者更好,gcc -ggdb3 -O0

以上是关于gdb 7.5.1 调试通过 g 4.7.2 构建的可执行文件的问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境开发工具gdb调试工具+Makefile自动化构建工具

使用cmake与makefile调试需要指定的参数[GDB与Gprof参数]

使用cmake与makefile调试需要指定的参数[GDB与Gprof参数]

clang 3.1 在 Ubuntu 12.04 上构建的二进制文件无法使用 gdb 进行调试

Linux工具:软件包管理器yum | 编辑器vim | 编译器gcc/g++ | 调试器gdb | 自动化构建工具make/Makefile | Linux小程序:进度条 | git命令行

Linux调试器-gdb的使用