如何在核心文件中找到错误?

时间:2013-12-12 05:58:53

标签: c

我运行了一个C程序,它会创建分段错误并创建核心文件。 我需要清楚地解释在核心文件中发生分段错误的位置。 如何阅读该核心文件。

#include "stdio.h"
main()
 {
  char *ptr;
  *ptr=100;
  printf("\nPointer Value is :%s\n", ptr) ;
} 

您必须运行此程序并将核心文件大小的ulimit更改为无限制 使用此命令:

$ulimit -c unlimited
然后编译这个C程序并运行程序分段故障并发生核心文件 将被创建。如何读取核心文件并找到发生分段错误的位置。

先谢谢。

4 个答案:

答案 0 :(得分:4)

你有一个未初始化的指针(即你没有指向任何东西)。作为所有未初始化的局部变量,它的值是不确定的,可能是随机的,所以你不知道它指向的位置。

然后,您尝试将数字写入此随机位置,这会导致未定义的行为。未定义的行为是不可预测的,可能工作,可能导致意外发生,可能使程序崩溃,或者 >可能甚至导致nasal demons

进一步尝试将该指针用作字符串,一旦增益导致两个未定义行为的实例:一次因为指针未初始化,而当printf读取时字节后的字节,以查找字符串终止符。


还有另一种未定义行为的情况,即您的main函数未正确定义。它应该返回int,并且可以采用void参数或intchar**参数。这是C规范。没有合适的main在技术上是一个非法的程序,但不幸的是编程器让它滑倒是如此常见。


要在调试器中使用它,您可以在调试器中运行该程序:

$ gdb ./myProgram
...
(gdb) run
Starting program: /home/someone/myProgram

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400518 in main () at myProgram.c:5
5     *ptr=100;
(gdb) 

或者在崩溃并创建核心转储后,使用核心转储运行调试器:

$ ./myProgram
Segmentation fault (core dumped)
$ gdb ./myProgram core
...
Reading symbols from /home/someone/myProgram...done.
[New LWP 4655]

Core was generated by `./myProgram'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400518 in main () at myProgram.c:5
5     *ptr=100;
(gdb) 

顺便说一句,对于调试信息(调试器读取的“符号”),必须使用-g标志编译程序。

答案 1 :(得分:2)

您需要学习如何使用调试器。我猜你在使用Linux。

首先,使用

编译您的程序
 gcc -g -Wall prog.c -o progbin

您会收到有关ptr未初始化的警告;请解决这个问题。你可能需要像

这样的东西
 char somebuf[10];
 ptr = somebuf;

或喜欢

 ptr = malloc(10);
 if (!ptr) { perror("malloc"); exit(EXIT_FAILURE); };

然后使用调试器实时

 gdb progbin

(gdb)提示符下,输入help。然后阅读GDB documentation:非常有用的GDB命令是bt(回溯),r(运行),b(中断),c(继续), p(打印),n(下一个),s(步骤),watch ...

调试(即“读取核心文件”)您已经的核心转储:

 gdb progbin core

并使用一些gdb命令,特别是bt(回溯,获取call stack)和p(打印一些变量或表达式,以及up& { {1}}走过callstack);确保down是使用编译器的progbin选项构建的。

给定-g文件,您可能会获得已使用core命令崩溃的程序文件。

答案 2 :(得分:2)

使用很少或没有调试优化编译程序 调试器将使用的注释会使事情变得很多 更容易:

$ gcc -g -ggdb -O0 foo.c -o foo

将核心文件加载到gdb ...

之后
$ gdb progbin core

...打印发生崩溃的位置:

Core was generated by `./foo'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400509 in main () at foo.c:5
5         *ptr=100;

在更复杂的程序中,打印回溯是有意义的。 (在 这个简单的程序将不再为您提供有用的信息:

(gdb) bt
#0  0x0000000000400509 in main () at foo.c:5

答案 3 :(得分:1)

您可以通过将coredump文件传递给gdb来读取它。 根据{{​​3}}核心转储文件包括计算机程序在特定时间记录的工作内存状态,通常是程序异常终止(崩溃)。

通常gdb接受可执行文件以进行调试。如果将可执行文件传递给gdb,它将执行该程序并提供相关信息。

如果你将coredump文件和你的可执行文件一起传递给gdb,它会检查你的程序,因为它已经崩溃了。