正在运行的应用程序以“分段错误”结束

gol*_*cks 47 debugging segmentation-fault

我有一个命令行应用程序,当运行时它没有做它应该做的事情,并且在某个时刻留下消息:

Segmentation fault
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我该怎么办?

gol*_*cks 72

段故障是存储器访问冲突的结果。该程序引用了分配给它的内存地址之外的内存地址,操作系统内核通过使用 SIGSEGV 终止程序来响应。

这是一个错误,因为尝试访问不可访问的内存是没有意义的(这是不可能的)。然而,这类错误很容易犯,尤其是在 C 和 C++(它们占许多常见应用程序)之类的语言中。它表示程序本身或其链接到的库中的错误。如果您希望报告错误(这样做 - 这会有所帮助),最好包含导致 seg 错误的事件的回溯

为此,您可以在内部运行程序gdb(GNU 调试器),如果尚未安装,则应该可以从任何 linux 发行版中获得该程序(该软件包将被称为“gdb”)。如果损坏的应用程序被称为“brokenapp”:

gdb brokenapp
Run Code Online (Sandbox Code Playgroud)

将出现一段关于版权和许可的段落,最后会出现一个带有光标的提示:

(gdb) _ 
Run Code Online (Sandbox Code Playgroud)

键入run并按回车键。如果您需要提供参数(例如-x --foo=bar whatever),请附加那些 ( run -x --foo=bar whatever)。程序会做它所做的,你会看到输出,如果你需要交互,你可以(注意你可以运行任何类型的程序,包括在 gdb 中的 GUI 程序)。在通常出现段错误的地方,您会看到:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
Run Code Online (Sandbox Code Playgroud)

这里的第二行输出只是一个例子。现在输入bt(对于“回溯”)并按回车键。你会看到这样的东西,虽然它可能更长:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()
Run Code Online (Sandbox Code Playgroud)

如果它更长,您一次只会得到一个屏幕,并且会有一条--More--消息。继续按回车键直到完成。您现在可以quit,输出将保留在您的终端中。将所有内容复制Program received signal SIGSEGV到文本文件中,并使用应用程序的错误跟踪器提交错误报告;您可以通过搜索在线找到这些,例如“brokenapp 错误报告”——您可能需要注册,以便通过电子邮件向您发送回复。包括您对问题的描述、您提供给 的任何参数run等,以及回溯的副本(如果它很长,可能有一种方法可以在错误跟踪器界面中附加一个文本文件)。还包括版本,如果您知道它是什么(brokenapp --version可能有效,或者手册页可能会指示如何获取),

有人希望在不久后回复您。提交错误通常是值得赞赏的。


gen*_*a2x 12

这意味着应用程序有一个错误。

  • 如果您是最终用户,则应联系应用程序的供应商。

    • 如果它带有 Linux 发行版,您应该为该发行版创建错误报告。
    • 对于第三方非商业应用程序,您应该向作者或此特定应用程序错误跟踪器报告错误。通常您可以通过浏览应用程序站点或下载的二进制/源代码包来找到位置。
    • 对于商业应用程序,您应该联系支持。
  • 如果是您自己的应用程序,您可以:

    1. 启用核心文件: $ ulimit -c unlimited
    2. 重现崩溃: $ ./yourapp
    3. 使用 gdb 调试崩溃: $ gdb ./yourapp core

核心文件对您以外的开发人员也非常有用——它们包含程序崩溃时的完整状态;如果您要提交错误报告,请附上它们,在某些情况下还附上您的应用程序二进制文件。请注意,您的个人数据(如帐号、密码和类似数据)在崩溃时保留在程序内存中的可能性很小。在许多情况下,仅报告崩溃线程的回溯对于开发人员找到问题有很大帮助。要获得回溯,您可以使用调试器(如gdb executable corefile)加载核心文件。

  • 我的观察是,与 UNIX 软件相比,Microsoft 软件的质量在很多情况下都很低,而且在 UNIX 世界中,人们通常不会参考他们的指南,这很好。 (7认同)