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
这意味着应用程序有一个错误。
如果您是最终用户,则应联系应用程序的供应商。
如果是您自己的应用程序,您可以:
$ ulimit -c unlimited$ ./yourapp$ gdb ./yourapp core核心文件对您以外的开发人员也非常有用——它们包含程序崩溃时的完整状态;如果您要提交错误报告,请附上它们,在某些情况下还附上您的应用程序二进制文件。请注意,您的个人数据(如帐号、密码和类似数据)在崩溃时保留在程序内存中的可能性很小。在许多情况下,仅报告崩溃线程的回溯对于开发人员找到问题有很大帮助。要获得回溯,您可以使用调试器(如gdb executable corefile)加载核心文件。
| 归档时间: |
|
| 查看次数: |
166601 次 |
| 最近记录: |