如何解决“分段错误(核心转储)”

我使用的是Ubuntu 14.04。

安装一些应用程序后,我遇到了分段错误(核心转储)错误。

这是什么意思 ? 我该如何解决这个问题?

例如

安装chrome-stable后,当我从终端启动时遇到此错误。

这是什么意思?

见AU:什么是分段故障? 还有一些例子如何重现它, SO:什么是分段错误? 。 我可以带来的最简单的描述(可能不是完美的):

该程序试图访问其自身部分的内存区域。 操作系统阻止它。

某些情况:使用初始化指针读取值,超出数组范围,函数调用(当不保持向后兼容性时),…

然而,找到大型程序的原因或者在其他项目库中inheritance的原因并不总是很容易。 并且大多数情况最终会出现错误报告,无论是针对目标程序还是针对其依赖性(上游项目或下游分发程序包)。

我该如何解决这个问题?

如果您没有进行任何自定义配置/设置,则安装了所有更新。 触发错误报告 ,请参阅如何报告错误?

如果Ubuntu支持的开源使用ubuntu-bugapport-bug )。 对于第三方封闭源,请查看其帮助页面如何报告错误并收集相关数据。


注意:如果您有一点编程背景,建议您尽量自行解决。 有许多错误报告多年没有活动。 或者至少收集足够的调试数据以在报告之前解决问题。

一些有用的调试工具

  1. apport-bug logs / core dump / backtrace

    如果您在分段错误之前没有错误消息。 使用--save选项运行它并查找回溯日志:

     apport-bug program-cmd --save bug-report_output.txt 
  2. gdb backtrace / debuging源代码

    如果它不起作用,请使用gdb

     $ gdb program-cmd (gdb) run (gdb) backtrace 

    如果您收到任何错误消息,请检查Web,启动板和上游项目错误跟踪器是否存在类似情况。

    对于一些高级用户或遵循ac / c ++学习路径的用户,他们可以下载相应的-dbg符号包。 然后,您可以使用gdb跟踪源代码中的程序流,并获取引发运行时错误的确切函数/指令。

  3. strace系统呼叫跟踪

    可能有帮助的另一个工具是strace ,我喜欢它。 它真的是一个强大的工具。

    它呈现出来:

    在最简单的情况下, strace运行指定的命令直到它退出。 它拦截并记录由进程调用的系统调用和进程接收的信号。 每个系统调用的名称,其参数和返回值都打印在标准错误或使用-o选项指定的文件上。

    strace是一种有用的诊断,指导和调试工具。 系统管理员,诊断工作者和故障排除者会发现它对于解决源代码不易获得的程序的问题非常宝贵,因为它们不需要重新编译以便跟踪它们。 学生,黑客和过于好奇的人会发现,通过跟踪普通程序,可以了解系统及其系统调用的大量信息。 程序员会发现,由于系统调用和信号是在用户/内核接口发生的事件,因此仔细检查此边界对于错误隔离,健全性检查和尝试捕获竞争条件非常有用。

    资料来源: man strace

  4. ltrace动态库调用跟踪

    ltrace是一个只运行指定命令直到它退出的程序。 它拦截并记录由执行过程调用的动态库调用以及该过程接收的信号。 它还可以拦截和打印程序执行的系统调用。

    它的用途与strace (1)非常相似。

    资料来源: man ltrace