如何在我的代码中知道具有分段错误的行?

时间:2013-07-18 21:12:10

标签: c pointers segmentation-fault

我正在尝试学习C指针这些天,当我尝试处理字符串和指针时,链接列表我经常遇到分段错误。我无法解决这些问题(我无法找到发生分段错误的确切行)。我的问题是:

  1. 在我的代码中找到包含分段错误的行的工具是什么?

  2. 您是否有任何材料(书籍或教程)建议我了解与细分错误,原因和解决方案相关的所有问题?

  3. gdb输出:

    /home/sri/Documents/projects/practice/c/strings/a.out...done.
    (gdb) run
    Starting program: /home/sri/Documents/projects/practice/c/strings/a.out 
    Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
    Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
    Missing separate debuginfo for /lib64/libc.so.6
    Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
    this is print1 char *p 
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000004005dd in do_print2 (p=0x7fffffffdda0) at string_orguments.c:16
    16      strcat(p[0],"added");
    (gdb) 
    

1 个答案:

答案 0 :(得分:3)

由于OS检测到进程的内存权限违规 - 对有效内存的无效访问会产生:SIGSEGV

在输出中:

Program received signal SIGSEGV, Segmentation fault.
 0x00000000004005dd in do_print2 (p=0x7fffffffdda0) at string_orguments.c:16
 16     strcat(p[0],"added");

strcat(p[0],"added");处显示您正在尝试写入只读的内存 - 对有效内存的无效操作。

注意:strcat函数在第一步尝试在第a位于"added"的位置从第二个参数字符串文字\0写入char p[0] 。所以你可能得到信号SIGSEGV,因为写操作无效代替\0(可能在只读存储器上写入)。

另请注意:访问无效地址会显示:SIGBUS

阅读:strcat() implementation works but causes a core dump at the end要更好地理解。

在算法上查找分段错误是无法解决的问题,您没有任何工具(自动化工具)用于此目的。但只有这样才能使用gdb类工具来破坏您的代码。 另外,为了避免分段错误,请准确读取语言主体/ ruls。您应该清楚为什么会出现分段错误。那么只有通过实践和经验,你才能学会如何编写更少的错误和更多可调试的代码。

此外,您应该了解运行时发生的分段错误。可能是您的代码对某些值集合运行良好,但对某些值集合则不行。因此,在编译时无法检测到分段。

这也说明了为什么它无法解决的问题,因为我们不能编写生成随机无限输入的通用算法,并测试你的代码是否完美运行!