gdb map显示不正确的成员变量

时间:2017-08-31 22:09:15

标签: c++ c debugging pointers gdb

我正在尝试调试在测试系统上生成的核心文件。它是由于被触发的assert()而生成的。

bt显示多个帧?其次是实际功能。不知道为什么会这样。

(gdb) bt
#0  0x00007f6c2d1eb035 in ?? ()
#1  0x00007f6c2d1ee79b in ?? ()
#2  0x00007f64fc3b0240 in ?? ()
#3  0x00007f6c2fdeb092 in ?? ()
#4  0x00007f6c2d1bbc58 in ?? ()
#5  0x00007f6c3205d9c0 in ?? ()
#6  0x0000000002a06a00 in ?? ()
#7  0x00007f64fc3b0150 in ?? ()
#8  0x00007f64fc3b0170 in ?? ()
#9 0x00000000018fb2cb in operator,<AssertCollectorBase> (this=<optimized out>, t=...) at ./shared/Assert.h:116
#10 X (platformContext=<optimized out>, severity=<optimized out>, msg=0x7f64fc3b0740 "Enabling poll on wrong connection.") at ss/*.cpp:497
#11 0x00000000025c2fd7 in Y (severity=1 '\001', msg=...) at *.cc:1065
#12 0x00000000025d0875 in Z (this=0x7f6bcbbbe440) at *.cc:870
#13 0x00007f6c2ebe0e9a in ?? ()
#14 0x0000000000000000 in ?? ()

我去了包含断言的框架并尝试打印出一些本地的 和成员变量。一些变量一直在说&#39;无法访问内存0x&lt; some-memory-addr&gt;&#39;
我试图打印一个STL地图 - 但返回的指针总是无效的。

(gdb) pmap connmap_ int SmaConnection* 
elem[0].left: $1 = 219
elem[0].right: $2 = (SmaConnection *) 0x9c63d4e000007f6b
elem[1].left: $3 = 463
elem[1].right: $4 = (SmaConnection *) 0x9c63bd4000007f6b
elem[2].left: $5 = 469
elem[2].right: $6 = (SmaConnection *) 0x9c63e82000007f6b
elem[3].left: $7 = 471
(gdb) p *$2
Cannot access memory at address 0x9c63d4e000007f6b
(gdb) 

即使程序没有出错,地图中的指针值似乎总是被gdb错误地报告 我将指针存储在地图中的方式有​​问题吗? 我在检查地图时有什么不对吗? 我还能做些什么来正确访问内存吗?

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,因为我的代码处于Release模式。 例如,在运行cmake时是否添加了标记-DCMAKE_BUILD_TYPE=Debug? 还是gcc -g选项标志? (http://www.rapidtables.com/code/linux/gcc/gcc-g.htm

答案 1 :(得分:0)

  

bt显示多个帧?其次是实际功能。不知道为什么会这样。

最有可能是因为测试和开发系统之间的系统库不匹配。有关如何解决此问题,请参阅this answer

  

gdb

似乎总是错误地报告地图中的指针值

如果你确实存在不匹配(我确实是99.9%),那么你可以忽略堆栈的其余部分 - 它被保证是假的。