C 核心转储中的gdb视图结构值

C 核心转储中的gdb视图结构值,c,debugging,gdb,C,Debugging,Gdb,我在用gdb分析内核转储时遇到问题。我无法查看C代码中任何结构的内容。 当我使用: print myStruct->val 我明白了 或 我也犯了同样的错误 当我试图打印代码中其他结构的内容时,就会发生这种情况。 但当我试图打印函数中的局部变量时,它打印的是ok 执行的命令顺序为: gdb ./myApp ./core (gdb)bt . . . #25 0x0868b276 in ikev2_check_icv (ike_sa=0x2031b860, packet=0x2031a950

我在用gdb分析内核转储时遇到问题。我无法查看C代码中任何结构的内容。 当我使用:

print myStruct->val
我明白了

我也犯了同样的错误

当我试图打印代码中其他结构的内容时,就会发生这种情况。 但当我试图打印函数中的局部变量时,它打印的是ok

执行的命令顺序为:

gdb ./myApp ./core
(gdb)bt
.
.
.
#25 0x0868b276 in ikev2_check_icv (ike_sa=0x2031b860, packet=0x2031a950) at ikev2_payload.c:460
.
.
(gdb) frame 25
(gdb) print ike_sa
$1 = (struct ikev2_sa *) 0x2031b860
(gdb) print *ike_sa
Cannot access memory at address 0x2031b860
(gdb) 
所以我的问题是,核心转储是否捕获分配给malloc的内存块?不仅仅是堆栈帧内存,正如本例所示

我在Linux 2.6.32.45-0.3-xen x86_64上运行这个

所以我的问题是,核心转储是否捕获分配给malloc的内存块?不仅仅是堆栈帧内存,正如本例所示

这是正确的

您观察到的症状通常表明您的
核心
被截断

如果
ulimit-c
过低,或者写入时磁盘空间不足,就会发生这种情况


另一种可能是您的
内核在传输过程中受损,例如,您通过FTP将其从一台机器传输到另一台机器进行分析。

无法访问内存这一事实可能是导致内核转储的原因。使用堆栈跟踪查看指向结构的指针来自何处。或者使用Valgrind跟踪未初始化的数据。抱歉,事实并非如此。核心转储是由于另一个问题。我知道崩溃发生在哪里,这只是为了在使用gdb时增强能力。正如我所说,我无法看到代码中其他结构的内容。这是一个很大的代码,但是我很确定这个例子中的结构被正确地分配和初始化。malloc'ed内存应该在核心转储中,如果corefile ulimit没有在转储堆的该部分数据之前导致核心转储被截断的话。在gdb中运行
info files
,查看核心转储文件映射的地址范围是否包括0x2031b860。您说得对,Mark,(gdb)print ike_sa$1=(struct ikev2_sa*)0x20331880(gdb)info files 0x20000000-0x20000000与我看不到的另一个结构一样被加载4。(gdb)打印数据包$3=(rc_vchar_t*)0x20329ec0也在此范围内。这是否意味着这些结构没有正确分配?嗨,我没有ftp文件,ulimit-c显示,无限…我的磁盘上有53G可用空间。还有别的原因吗?
print *myStruct
gdb ./myApp ./core
(gdb)bt
.
.
.
#25 0x0868b276 in ikev2_check_icv (ike_sa=0x2031b860, packet=0x2031a950) at ikev2_payload.c:460
.
.
(gdb) frame 25
(gdb) print ike_sa
$1 = (struct ikev2_sa *) 0x2031b860
(gdb) print *ike_sa
Cannot access memory at address 0x2031b860
(gdb)