我有一个命令行应用程序,当运行时它没有执行它应该执行的操作,并且在某个时刻留下消息:
Segmentation fault
这是什么意思?我应该怎么办?
答案1
A分段故障是内存访问冲突的结果。该程序引用了分配给它的内存地址之外的内存地址,操作系统内核通过使用 SIGSEGV 终止该程序来做出响应。
这是一个错误,因为尝试访问无法访问的内存是没有意义的(这是不可能的)。然而,这种类型的错误很容易犯,特别是在 C 和 C++ 等语言中(它们占据了许多常见的应用程序)。它表明程序本身或其链接的库中存在错误。如果您想报告错误(这样做 - 这有帮助),最好包含回溯导致段错误的事件。
为此,您可以在内部运行该程序gdb
(GNU 调试器),如果尚未安装,则可以从任何 Linux 发行版中使用该程序(该软件包将被称为“gdb”)。如果损坏的应用程序称为“brokenapp”:
gdb brokenapp
将出现一段关于版权和许可的内容,最后会出现带有光标的提示:
(gdb) _
输入run
并按 Enter 键。如果您需要提供参数(例如-x --foo=bar whatever
),请附加这些参数(run -x --foo=bar whatever
)。该程序将执行其操作,您将看到输出,如果您需要交互,则可以(注意您可以在 gdb 内运行任何类型的程序,包括 GUI 程序)。在通常出现段错误的地方,您会看到:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
这里的第二行输出只是一个示例。现在输入bt
(“backtrace”)并按 Enter 键。您会看到类似这样的内容,尽管它可能会更长:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
如果更长,您一次只会看到一屏,并且会有一条--More--
消息。继续按 Enter 直到完成。现在quit
,输出将保留在您的终端中。将所有内容复制Program received signal SIGSEGV
到文本文件中,并使用应用程序的错误跟踪器提交错误报告;您可以通过搜索在线找到这些信息,例如“brokenapp bug 报告”——您可能需要注册,以便可以通过电子邮件向您发送回复。包括您对问题的描述、您提供给 的任何参数run
等,以及回溯的副本(如果它很长,可能有一种方法可以在错误跟踪器界面中附加文本文件)。如果您知道它是什么(brokenapp --version
可能有效,或者手册页可能指示如何获取它),还请包括版本,以及您正在使用的发行版。
希望很快就会有人回复您。提交错误通常会受到赞赏。
答案2
这意味着该应用程序存在错误。
如果您是最终用户,您应该联系应用程序的供应商。
- 如果它附带 Linux 发行版,您应该为该发行版创建错误报告。
- 对于第三方非商业应用程序,您应该向作者或此特定应用程序错误跟踪器报告错误。通常您可以通过浏览应用程序站点或下载的二进制/源代码包来找到位置。
- 对于商业应用程序,您应该联系支持人员。
如果是您自己的应用程序,您可以:
- 启用核心文件:
$ ulimit -c unlimited
- 重现崩溃:
$ ./yourapp
- 使用 gdb 调试崩溃:
$ gdb ./yourapp core
- 启用核心文件:
核心文件对于您以外的开发人员也非常有用 - 它们包含程序崩溃时的完整状态;如果您要提交错误报告,请附上它们,在某些情况下还附上您的应用程序二进制文件。请注意,在崩溃时,您的个人数据(例如帐号、密码等)极有可能保留在程序的内存中。在许多情况下,仅报告崩溃线程的回溯对于开发人员发现问题有很大帮助。要获得回溯,您可以使用调试器加载核心文件(如gdb executable corefile
)。