linux之core文件如何查看和调试

让我们通过一个具体的例子来演示如何使用GDB调试器来分析一个简单的C程序产生的core文件。

首先,假设我们有一个简单的C程序,example.c,如下所示:

#include <stdio.h> 
void function_b() { char *ptr = NULL; *ptr = 0; // 故意的空指针解引用导致段错误} void function_a() { function_b(); } 
int main() 
{
 function_a();
 return 0; 
}

接下来是编译这个程序,并确保带有调试信息:

gcc -g -o example example.c

在运行这个程序之前,我们需要确保操作系统允许生成core文件。在bash shell中,我们可以使用ulimit命令:

ulimit -c unlimited

现在运行程序,它将崩溃,并生成一个名为core的core文件(或者可能是带有进程号的core文件,例如core.12345):

 ./example

现在我们使用GDB来分析core文件:

gdb ./example core

在GDB中,我们可以使用bt命令查看崩溃时的堆栈跟踪:

(gdb) bt#0 0x000055555555467a in function_b () at example.c:5#1 0x000055555555469c in function_a () at example.c:9#2 0x00005555555546aa in main () at example.c:13

这个堆栈跟踪显示了崩溃发生在example.c的第5行。我们可以使用list命令来查看源码:

(gdb) list 1 #include <stdio.h> 2 3 void function_b() { 4 char *ptr = NULL; 5 *ptr = 0; // 故意的空指针解引用导致段错误 6 } 7 8 void function_a() { 9 function_b(); 10 }

很明显,第5行尝试解引用一个空指针,这是导致程序崩溃的原因。

我们还可以检查当前的函数调用和局部变量:

(gdb) frame 0#0 0x000055555555467a in function_b () at example.c:55 *ptr = 0; // 故意的空指针解引用导致段错误 (gdb) info locals ptr = 0x0

这里,info locals告诉我们ptr是一个空指针(值为0x0)。

通过这些信息,我们可以确定程序崩溃是因为在function_b中尝试解引用了一个空指针。我们可以通过修改代码来避免这种情况发生,例如通过在解引用之前检查指针是否为NULL。

修复后的function_b可能看起来像这样:

void function_b() { char *ptr = NULL; if (ptr != NULL) { *ptr = 0; } }

重新编译并运行程序,这次它不应该再崩溃了。这就是使用GDB和core文件来调试和解决问题的基本过程。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔老大RabbitMQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值