我有一个命令行程序,运行时没有做它应该做的事,在某一点上留下了信息:
Segmentation fault
这是什么意思? 我应该怎么做?
段落故障]1是内存访问违规的结果。 程序提到了分配给它的内存地址之外的地方,操作系统内核以SIGSEGV的方式响应,杀死了程序。
这是一个错误,因为试图访问不可访问的内存是没有意义的(无法做到)。 然而,这种错误是很容易犯的,特别是在C和C++这样的语言中(占了很多常见的应用)。 这表明程序本身或其链接的库中有一个错误。 如果你想报告这个错误(请报告--这很有帮助),最好包括一个导致seg故障的事件的*回溯。
要做到这一点,你可以在gdb
(GNU调试器)中运行该程序,如果还没有安装的话,任何Linux发行版都可以得到该程序(该包将被称为"gdb")。 如果被破坏的应用程序被称为"brokeapp":
gdb brokenapp
将出现一段关于版权和许可的内容,最后是一个带有光标的提示:
(gdb) _
输入 "run "并点击回车。 如果你需要提供参数(例如:-x --foo=bar whatever
),请附加这些参数(run -x --foo=bar whatever
)。 程序将做它所做的事情,你将看到输出,如果你需要互动,你可以(注意你可以在gdb中运行任何类型的程序,包括GUI程序)。 在它通常发生分离故障的地方,你会看到:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
这里的第二行输出只是一个例子。 现在输入bt
(代表"回溯")并点击回车。 你会看到类似这样的东西,尽管它可能要长很多:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
如果更长,你每次只能看到一屏,而且会有一个 "更多 "信息。 继续按回车键,直到完成。现在你可以 "退出 "了,输出将保留在你的终端。 将从 "程序收到信号SIGSEGV "开始的所有内容复制到一个文本文件中,并向应用程序的错误跟踪器提交一份错误报告;你可以通过搜索找到这些报告,例如"brokenapp错误报告"--你可能需要注册,以便通过电子邮件向你发送回复。 包括你对问题的描述,你提供给 "运行 "的任何参数,等等,以及一份回溯的副本(如果它非常长,在bug追踪界面上可能有办法附加一个文本文件)。还包括版本,如果你知道它是什么(brokenapp --version
可能有用,或者手册页可能指出如何获得这个),以及你使用的是哪个发行版。
希望有人能在不久之后给你答复。 提交bug通常是值得赞赏的。
这意味着该应用程序有一个错误。
如果你是一个终端用户,你应该联系该应用程序的供应商。
如果它是与Linux发行版一起的,你应该为该发行版创建一个bug报告。
对于第三方非商业应用程序,你应该向作者或该特定应用程序的错误跟踪器报告该错误。通常你可以通过浏览应用程序网站或下载的二进制/源码包找到这个地方。
对于商业应用程序,你应该联系支持部门。
如果这是你自己的应用程序,你可以:
$ ulimit -c unlimited
。$ ./yourapp
。$ gdb ./yourapp core
。核心文件对于除你之外的开发者来说也是非常有用的--它们包含了程序在崩溃时的全部状态;如果你要提交一份错误报告,请附上它们,在某些情况下还可以附上你的应用程序二进制文件。请注意,在崩溃的那一刻,你的个人数据,如账号、密码和类似的数据有可能留在程序的内存中,这是一个很小的机会。在许多情况下,报告崩溃线程的回溯是对开发人员找到问题的很大帮助。为了得到回溯,你可以用调试器加载核心文件(如gdb executable corefile
)。