如何知道我的代码中的分段错误?

我试图学习C指针这些天,当我试图处理字符串和指针,并且链接列表我经常得到分割错误。 我无法解决这些问题(我无法找到发生分段错误的确切位置)。 我的问题是:

  • 在我的代码中找到带有分段错误的行的工具是什么?

  • 是否有任何材料(书或教程),您可以建议我了解有关分段故障,其原因和解决方案的所有问题?

  • 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) 
    

    由于操作系统检测到进程违反内存权限 - 对有效内存的无效访问提供: 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(p[0],"added"); 您正在尝试写入只读的内存 - 有效内存上的无效操作。

    注意:第一步中的strcat函数尝试从第二个参数字符串文字"added"写入char ap[0] 。 因此,您可能会收到SIGSEGV信号,因为写入操作无效,无法替代 (只读存储器上的可能写入)。

    另请注意:访问无效地址的步骤如下: SIGBUS

    阅读:strcat()实现工作,但在最后导致核心转储为了更好地理解。

    在算法上发现分段故障是不可解决的问题,您没有任何工具(自动化工具)用于此目的。 但唯一的方法就是使用gdb like工具来bug代码。 另外为了避免分段错误,准确地读取语言原则/规则。 你应该清楚为什么出现分段错误。 那么只有通过实践和经验,你可以学习如何编写更少的bug和更多的可调试代码。

    您也应该了解在运行时发生分段故障。 可能是你的代码对一些值的运行良好,但对某些值不适用。 所以在编译时无法检测到分割。

    这也说明了为什么它无法解决的问题,因为我们不能编写一般算法,它会产生随机无限输入并测试您的代码是否完美工作!

    链接地址: http://www.djcxy.com/p/43895.html

    上一篇: How to know line with segmentation fault in my code?

    下一篇: segmentation fault x86 <