g++4.8在gdb中隐藏变量
g++4.8 hides variables from gdb
最近升级到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
我看过一些类似的帖子,其中- 0标志被推荐,但它似乎在这里不起作用。在用g++4.6编译后,完全相同的会话产生预期的结果。关于是什么导致了g++4.8的这个问题,有什么想法吗?
这里的特殊问题是,调试信息中的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只识别第一个版本,并以一种不能在此范围内有任何变量的方式解释第二个版本。
可能的解决方案是使用-gdwarf-2编译或升级GDB。
gdb和gcc在调试格式方面需要是兼容的版本(它们通常在许多版本之间都能很好地兼容,但有时从一个版本的编译器到另一个版本的兼容性会被破坏)。
我也遇到过同样的问题。解决的办法是要么给gcc一些标志,让它用"老式的调试格式"来编译,要么把gdb的版本升级到一个能"工作"于新版gcc给出的调试格式的版本。
就好了如果gdb说类似"你的调试格式是X,你需要调试格式Y或Z gdb正常工作",但我不是100%肯定可以可靠地确定(例如,当发现一个bug的一代是固定的,并需要相应的修复在调试器中,因为同样的错误出现在"生产"answers"消费"部分的调试符号处理程序,所以一个年长的,有bug的版本不能读新的unbuggy格式,反之亦然)
相关文章:
- C++继承模板类:隐藏成员变量
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 局部变量如何隐藏全局变量
- 双向量隐藏变量
- 编译器不应该对派生类中隐藏的基本结构的成员变量发出警告吗?
- 隐藏子类中的变量
- Visual studio调试工具提示-隐藏变量
- 如何向调试器隐藏变量/函数名
- 为什么局部变量不隐藏数组定义中的全局变量
- 类中的函数,该函数乘以2个隐藏变量
- 类型名称路径由一个静态变量隐藏
- 隐藏 c++ 源文件中变量的可见性
- 在 c++ 中隐藏 int 变量的名称
- C++通过继承隐藏变量
- 如何在dll导出的类中隐藏成员变量
- 捕获的变量隐藏了lambda中传递的变量.如何解除隐藏
- 在g++中我可以访问哪些其他隐藏变量(使用宏预先定义的)?
- g++4.8在gdb中隐藏变量
- 是否有一种方法来隐藏变量在cout (c++)