确定导致分段错误的C代码行?

我们如何确定导致分段错误的代码中的错误?

在编写一些代码之后,为了确定哪里出现了分段错误,gcc可以告诉我在特定的行号中有一个错误(或input错误) – 因为该行导致了分段错误?

海湾合作委员会不能做到这一点,但GDB肯定可以。 使用-g开关编译程序,如下所示:

 gcc program.c -g 

然后使用gdb:

 $ gdb ./a.out (gdb) run <segfault happens here> (gdb) backtrace <offending code is shown here> 

这里是一个很好的教程,让你开始使用GDB。

另外,您可以尝试Valgrind:如果您安装Valgrind并运行valgrind –leak-check = full,那么它将运行您的程序并显示任何段错误的堆栈跟踪,以及任何无效的内存读取或写入以及内存泄漏。 这真的很有用。

你也可以使用核心转储,然后用gdb进行检查。 要获得有用的信息,您还需要使用-g标志进行编译。

每当你收到消息:

  Segmentation fault (core dumped) 

一个核心文件被写入你的当前目录。 你可以用命令来检查它

  gdb your_program core_file 

该文件包含程序崩溃时的内存状态。 在部署软件期间,核心转储很有用。

确保您的系统不会将核心转储文件大小设置为零。 您可以将其设置为无限:

ulimit -c unlimited

小心虽然! 核心转储可能变得巨大

卢卡斯关于核心转储的答案是好的。 在我的.cshrc中我有:

 alias core 'ls -lt core; echo where | gdb -core=core -silent; echo "\n"' 

通过input'core'显示回溯。 和date戳记,以确保我正在寻找正确的文件:(。

补充 :如果存在堆栈损坏错误,则应用于核心转储的回溯往往是垃圾。 在这种情况下,按照公认的答案(假设故障很容易重现),在gdb内运行程序可以得到更好的结果。 同时也谨防多个进程同时倾销核心; 一些操作系统将PID添加到核心文件的名称中。