在最近升级到g++ 4.8.1之后,我发现在gdb中调试是完全不可能的。g++似乎对gdb隐藏了所有变量,而不考虑优化选项。在下一次会议中,runner.cpp如下:
#include <vector>
using namespace std;
int main(void) {
vector<int> arr;
int a = 3;
int b = 2;
b = a + 3;
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
return 0;
}其结果是:
Script started on Tue 14 Jul 2015 01:11:14 PM PDT
me@ministation:~/Development/clib$ g++ -g -O0 runner.cpp
me@ministation:~/Development/clib$ gdb -q ./a.out
Reading symbols from /home/me/Development/clib/a.out...done.
(gdb) break 11
Breakpoint 1 at 0x40095c: file runner.cpp, line 11.
(gdb) run
Starting program: /home/me/Development/clib/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, main () at runner.cpp:11
11 arr.push_back(1);
(gdb) print a
$1 = {i = {0, 1045149306}, d = 1.2904777690891933e-08} ## I have no idea what this means
(gdb) print b
$2 = {i = {0, 1068498944}, d = 0.0625}
(gdb) print arr
No symbol "arr" in current context.
(gdb) info locals
No locals.
(gdb) next
12 arr.push_back(2);
(gdb)
13 arr.push_back(3);
(gdb) print arr
No symbol "arr" in current context.
(gdb) next
14 arr.push_back(4);
(gdb)
16 return 0;
(gdb) print arr
No symbol "arr" in current context.
(gdb) q
A debugging session is active.
Inferior 1 [process 6392] will be killed.
Quit anyway? (y or n) y
me@ministation:~/Development/clib$
Script done on Tue 14 Jul 2015 01:12:05 PM PDT我看到过一些类似的帖子,推荐使用-O0标志,但这里似乎不起作用。使用g++4.6编译后的完全相同的会话会产生预期的结果。对于g++4.8造成这种情况的原因有什么想法吗?
发布于 2015-07-14 21:44:24
当涉及到调试格式时,gdb和gcc需要兼容版本(而且它们通常比许多版本兼容得很好,但有时兼容性在编译器的一个版本到另一个版本之间会中断)。
我也遇到过同样的问题。解决方案要么是向gcc抛出一面旗帜,用“旧风格的调试格式”进行编译,要么将gdb的版本升级为一个“使用”最新版本gcc提供的调试格式的版本。
如果gdb实际上说了“您的调试格式为X,您需要调试格式Y或Z才能使gdb正常工作”,那就更好了,但我不能100%确定是否可以可靠地确定这一点(例如,当在已修复的生成中发现bug时,需要在调试器中进行相应的修复,因为在调试程序的“产生”和“消耗”两个部分中都会出现相同的bug -符号处理程序-因此旧版本的错误版本不能读取更新的无bug格式,反之亦然)
发布于 2015-07-16 21:50:03
这里的特殊问题是,调试信息中的DW_AT_high_pc标记的含义已经扩展到也意味着偏移量。
最初,从0x804dd8e到0x804ddae的函数被编码为
DW_AT_low_pc : 0x804dd8e
DW_AT_high_pc : 0x804ddae现在它也可以被编码为
DW_AT_low_pc : 0x804dd8e
DW_AT_high_pc : 0x20这在调试信息中节省了一点空间。
GDB的旧版本只识别第一个版本,而解释第二个版本的方式是在此范围内不存在任何变量。
可能的解决方案是使用-g侏罗-2编译或升级GDB。
https://stackoverflow.com/questions/31416644
复制相似问题