我运行了一个 C 程序,它会创建段错误并创建核心文件。 我需要清楚的解释核心文件中段错误发生的位置。 如何读取该核心文件。
#include "stdio.h"
main()
{
char *ptr;
*ptr=100;
printf("\nPointer Value is :%s\n", ptr) ;
}
您必须运行此程序并将核心文件大小的 ulimit 更改为无限制 使用此命令:
$ulimit -c unlimited
然后编译这个C程序并运行会出现程序段错误和core文件 将被创建。如何读取核心文件并查找发生段错误的位置。
提前致谢。
最佳答案
你有一个未初始化的指针(即你没有让它指向任何东西)。与所有未初始化的局部变量一样,它的值是不确定的并且可能是随机的,因此您不知道它指向哪里。
然后,您尝试将数字写入此随机位置,这会导致未定义的行为。未定义的行为是不可预测的,它可能起作用,它可能导致意外发生,它可能使程序崩溃,或者它可能>甚至可能导致nasal demons .
您进一步尝试将该指针用作字符串,这一次增益会导致两个未定义行为的实例:一次是因为指针未初始化,另一次是在 printf
逐字节读取以查找字符串终止符。
还有另一种未定义行为的情况,那就是您的 main
函数未正确定义。它应该返回一个 int
并接受一个 void
参数或一个 int
和一个 char**
参数。这是 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
标志进行编译。
关于c - 如何查找core文件中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536093/