我运行了一个C程序,它会创建分段错误并创建核心文件。 我需要清楚地解释在核心文件中发生分段错误的位置。 如何阅读该核心文件。
#include "stdio.h"
main()
{
char *ptr;
*ptr=100;
printf("\nPointer Value is :%s\n", ptr) ;
}
您必须运行此程序并将核心文件大小的ulimit更改为无限制 使用此命令:
$ulimit -c unlimited
然后编译这个C程序并运行程序分段故障并发生核心文件
将被创建。如何读取核心文件并找到发生分段错误的位置。
先谢谢。
答案 0 :(得分:4)
你有一个未初始化的指针(即你没有指向任何东西)。作为所有未初始化的局部变量,它的值是不确定的,可能是随机的,所以你不知道它指向的位置。
然后,您尝试将数字写入此随机位置,这会导致未定义的行为。未定义的行为是不可预测的,可能工作,可能导致意外发生,可能使程序崩溃,或者 >可能甚至导致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
标志编译程序。
答案 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,它会检查你的程序,因为它已经崩溃了。