gdb映射显示不正确的成员变量

问题描述:

我正在尝试调试在测试系统上生成的核心文件。它是由于被触发的assert()而生成的。
gdb映射显示不正确的成员变量

该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 ??() 

我去了包含断言的框架,并试图打印出一些地方 和成员变量。有些变量总是说'不能访问内存0x < some-memory-addr>'
我试图打印一个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错误地报告。
我在地图上存储指针的方式有什么问题吗?
我在检查地图时是否有问题?
还有什么我可以做的正确访问内存?

我有一个类似的问题,因为我的代码是在Release模式。 例如,您在运行cmake时是否添加了国旗-DCMAKE_BUILD_TYPE=Debug? 或gcc -g选项标志? (http://www.rapidtables.com/code/linux/gcc/gcc-g.htm

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

很可能是因为测试系统和开发系统之间的系统库不匹配。请参阅this answer关于如何修复它。

在地图上的指针值似乎总是如果你有一个不匹配(这我99.9%肯定你这样做)由GDB

报告错误,那么你就可以忽略其余堆栈 - 它保证是假的。