c - 如何查找core文件中的错误?

标签 c

我运行了一个 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/

相关文章:

c# - 关于C#中数组下标的问题

CS50 Pset3音乐最终计算

c - 动态链接 C 驱动程序后 undefined symbol

c - 分配指针时,memcpy 和只是分配有什么区别?

c - 在 netbeans C 中使用 header

c:要 float 的字符串(仅适用于 Libc)?

arrays - 为什么使用 C 引用这个 char 数组会导致堆栈崩溃?

c - 使用 *varname 定义字符串时,Sprintf 失败,传递给 loadrunner 中函数的参数无效

c - c文件操作中的段错误

c - 打印没有小数位的 double