c - gdb 查看核心转储中的结构值

标签 c debugging gdb

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

print myStruct->val

我明白了

Cannot access memory at address 0x2031b860 

或者

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) 

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

我在 Linux 2.6.32.45-0.3-xen x86_64 上运行此程序

最佳答案

So my question is, does core dump catch memory blocks allocated with malloc? Not just stack frame memory, as it seems from this example.

这是正确的。

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

当您的 ulimit -c 太低,或者当您写入它的磁盘空间不足时,可能会发生这种情况。

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

关于c - gdb 查看核心转储中的结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26781711/

相关文章:

c - 如何通过 execvp 将 gdb 调试到子进程中启动的进程?

c++ - gdb 说 "cannot open shared object file"

c++ - 使用比平台提供的更新版本的 GCC 需要什么

c - C99 中与调整参数相关的未定义行为

c - 从 C 中的 32 位 float 中提取位

c - 使用递归函数计算两个数字的 GCD - 出了什么问题?

Ruby 调试器在 STDIN 上失败。获取用户输入

java - 为什么我的 java 代码没有继续执行 if 语句?

c++ - 无法访问存储在多维 vector 中的对象 (C++)

gcc - 为什么我的汇编程序转储中的地址与寄存器地址不同?