【问题标题】:How to know line with segmentation fault in my code?如何知道我的代码中的分段错误?
【发布时间】:2013-07-18 21:12:10
【问题描述】:

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

  1. 有什么工具可以在我的代码中找到分段错误的行?

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

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) 

【问题讨论】:

  • @jxh p 实际上是 char 指针数组(来自相关问题)。
  • 我不明白为什么“at string_orguments.c:16”没有告诉你错误在第16行?
  • 感谢 Drew McGowen,这是第 16 行的错误。非常感谢
  • 已修复...一切为您服务...
  • 问题是您不应该寻找“分段错误”,这是症状,并且通常是相当不可预测的。 原因是内存管理不佳/损坏 - 查找。

标签: c pointers segmentation-fault


【解决方案1】:

当操作系统检测到进程违反内存权限时——对有效内存的无效访问会给出: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 函数在第一步尝试从第二个参数字符串文字 "added" 在 \0 位于 p[0] 的位置写入字符 a。因此,您可能会收到信号SIGSEGV,因为写入操作在\0 的位置无效(可能写入只读存储器)。

另请注意:访问无效地址会给出:SIGBUS

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

通过算法查找分段错误是无法解决的问题,您没有任何工具(自动化工具)可用于此目的。但只有这样才能使用gdb 之类的工具来错误您的代码。 此外,为了避免分段错误,请准确阅读语言原则/规则。您应该清楚为什么会发生分段错误。那么只有通过实践和经验,您才能学习如何编写更少的错误和更可调试的代码。

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

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

【讨论】:

  • @SrinivasThanneeru 在这里等一下,不要再次/再次发布类似问题..等等我给你一个相关链接。
  • @SrinivasThanneeru:寓言式地查找分段错误是无法解决的问题,您没有任何工具可以解决此问题,但只有这样才能使用类似 gdb 的工具来错误您的代码,此外,为了避免分段错误,请精确读取语言主体.您应该清楚为什么会发生分段错误。那么只有通过实践和经验,你才能学会编写无错误的代码。
  • 我会将 *write free code" 改为 "write less bugy and more debuggable code"。
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 2015-07-13
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多