我正在使用 Ubuntu 14.04。
安装一些应用程序后,我遇到了分段错误(核心转储)。
这是什么意思?我该如何解决这个问题?
例如:
安装 chrome-stable 后,当我从终端启动它时遇到此错误。
答案1
这是什么意思?
看AU:什么是分段错误?这篇文章和这篇文章都有一些如何重现的例子,那么:什么是分段错误?。
我能想到的最简单的描述(可能不是完美的):
程序试图访问其自身部分之外的内存区域。操作系统阻止了它。
一些案例:使用未初始化的指针读取值、超出数组范围、函数调用(当不保持向后兼容性时)...
然而,对于大型程序或依赖于其他项目库的程序,找到原因并不总是那么容易。大多数情况下,最终都会出现错误报告,要么针对目标程序,要么针对它的某个依赖项(上游项目或下游分发包)。
我该如何解决这个问题?
触发错误报告
如果您没有进行任何自定义配置/设置并且安装了所有更新。发送错误报告, 看我如何报告错误?
如果 Ubuntu 支持开源,请使用
ubuntu-bug
(apport-bug
)。对于第三方闭源,请查看其帮助页面,了解如何报告错误和收集相关数据。主动调试
如果您有一点编程背景,建议您尽力自己解决问题。许多错误报告多年来一直处于闲置状态。至少,在报告问题时,您可能能够收集足够的调试数据来帮助解决问题。
这意味着你打破了用户抽象层并打开了黑匣子!(FLOSS 实际上有一个透明的盒子)。
一些有用的调试工具
一些......我的意思是,当你深入挖掘时,你会发现还有很多其他有用的工具。
apport-bug
日志/核心转储/回溯如果在出现分段错误之前没有出现错误消息,请使用
--save
选项运行它并查找回溯日志:apport-bug program-cmd --save bug-report_output.txt
gdb
回溯/调试源代码如果不起作用,请使用
gdb
:$ gdb program-cmd (gdb) run (gdb) backtrace
如果您收到任何错误消息,请检查网络、启动板和上游项目错误跟踪器中是否存在类似情况。
对于一些高级用户或正在遵循 ac/c++ 学习路径的用户,他们可以下载相应的
-dbg
符号包。然后您可以使用gdb
它来跟踪源代码中的程序流并获取引发运行时错误的确切函数/指令。对于基于 Ubuntu(Debian)的发行版,可以使用以下命令下载包的源代码:
apt-get source <package-name>
strace
系统调用跟踪另一个可能有帮助的工具是
strace
,我喜欢它。它真的是一个强大的工具。它表现为:
最简单的情况
strace
运行指定的命令直到退出。它拦截并记录进程调用的系统调用和进程接收的信号。每个系统调用的名称、其参数及其返回值都会打印在标准错误上或打印到使用 -o 选项指定的文件中。strace
是一种有用的诊断、指导和调试工具。系统管理员、诊断人员和故障排除人员会发现它对于解决源代码不易获得的程序问题非常有用,因为无需重新编译即可跟踪它们。学生、黑客和过于好奇的人会发现,通过跟踪甚至普通的程序,可以学到很多关于系统及其系统调用的知识。程序员会发现,由于系统调用和信号是发生在用户/内核接口的事件,因此仔细检查这个边界对于错误隔离、健全性检查和尝试捕获竞争条件非常有用。来源:
man strace
ltrace
动态库调用跟踪ltrace
是一个只运行指定命令直到退出的程序。它拦截并记录执行进程调用的动态库调用以及该进程接收到的信号。它还可以拦截并打印程序执行的系统调用。strace
其用法与(1)非常相似。来源:
man ltrace