c - 定位段错误的最简单方法

标签 c linux segmentation-fault

我今天遇到了我的第一个段错误(新手程序员)。在阅读了段错误是什么之后(感谢本网站上所有有用的信息,以及维基百科的冗长解释),我正在尝试确定找到我的错误发生位置的最简单方法。它是用 C 语言编写的,错误发生在基于 *NIX 的系统上(老实说,我不确定是哪一个……99% 确定它是 Linux)。我不能准确地发布我的代码,因为我有很多我正在编译的文件,它们都很长。我只是希望你们都观察到一些最佳实践。感谢您的帮助。

附言我认为错误来自于取消引用 NULL 指针或使用未初始化的指针。但是,我肯定是错的。

最佳答案

使用调试器,例如 gdb,或者如果这不适用,则使用 strace 工具来更好地了解段错误发生的位置。

如果您使用gcc,请确保使用-g 开关进行编译以包含调试信息。然后,gdb 将向您显示它在源代码中发生段错误的确切位置。

例如,如果我们有这个明显的段错误程序:

new.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}

我们用 gcc -g new.c -o new 编译它,然后用 gdb new 运行 gdb session :

我们在交互式 session 中发出 run 命令,其他的就很清楚了:

(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]

Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6               printf("%d", *i);
(gdb)

正如 DasMoeh 和 netcoder 所指出的,发生段错误时,您可以使用 backtrace命令在交互式 session 中打印调用堆栈。这有助于进一步查明段错误的位置。

关于c - 定位段错误的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11439467/

相关文章:

regex - Sed 不使用正则表达式

linux - 阻止 fedora 安装 mariadb

php - 如何诊断此 PHP 段错误?

c - 汇编返回 int 到 C 函数段错误

c - 如何在恒定时间内检查一组非重叠范围内的范围

c - 使用 IAR EWARM 手动将 .data 部分从闪存复制到 RAM

只有一个参数的素数递归函数

c++ - 用于动态重新加载/usr/share/zoneinfo 数据库的库/代码?

编译依赖外部库Opus和Faac的WebAssembly程序

C - 出现段错误(核心已转储)