我正在使用 ubuntu 14.04 64bit LTS,并且用 C 语言编写图像处理程序。当我在终端中运行任何程序时,它都会显示分段错误(核心转储)。
同一个程序在 10.04 中运行良好。
请问有什么帮助吗?
$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)
答案1
实际发生的具体情况很难说清楚,但我会举一个例子来说明这种问题。
重要的是,该程序在 10.04 上运行良好,但在 14.0 上失败。确切的问题可能不同,但相似且相关:
有些事情违反了规则
“段错误”错误通常意味着访问了一些不属于程序的内存。在 10.04 和 14.04 上都可能存在这样的非法内存访问,但在 10.04 上没有造成任何问题。
规则没有得到严格执行
这意味着它在 10.04 中只是偶然起作用;这是很有可能的,因为出于许多原因,程序“官方”内存附近的内存在技术上也可能属于您的程序。
这是为了让编译器更容易思考,或者通过更常规的内存访问使程序更快。
这样,程序可能被允许执行根据程序文本不允许执行的操作。
容忍度可以改变
您可以访问哪些“非官方”内存而不会出现分段错误取决于编译器版本和库版本,这两者都已发生更改。
最简单、最常见的情况应该是程序中存在错误,内存访问过度,例如通过索引中的 of-by-one 错误访问数组后的字节。
概括
这个 bug 以前就存在,但还是能运行。
现在,它却不能运行了,它只是一个导致分段错误的普通 bug。
从积极的一面来看:当它工作时,如果存在错误,它可能会产生错误的结果 - 这比你现在看到的崩溃要糟糕得多。
执行规则
调试此类问题的一个好方法是对程序进行插装,以强制执行正常运行时系统未强制执行的规则。
在查找内存访问问题时,可以执行此操作的一个工具是瓦尔格林德(man valgrind
)。