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

Rav*_*van 18 14.04

我正在使用 Ubuntu 14.04。

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

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

例如

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

use*_*.dz 15

这是什么意思?

请参阅AU:什么是分段错误?帖子和这篇帖子,其中有一些示例如何重现它,所以:什么是分段错误?.

我能提供的最简单的描述(可能不完美):

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

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

但是,对于大型程序或那些依赖于其他项目库的程序,并不总是很容易找到原因。并且大多数情况最终都会出现错误报告,无论是针对目标程序或其依赖项之一(上游项目或下游分发包)。

我该如何解决这个问题?

  • 触发错误报告

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

    如果 Ubuntu 支持开源,请使用ubuntu-bug( apport-bug)。对于 3rd 方封闭源代码,请查看他们的帮助页面如何报告错误和收集相关数据。

  • 主动调试

    如果您甚至有点编程背景,建议您尽量自己解决。有许多错误报告多年来一直处于非活动状态。至少,您可以在报告问题时收集足够的调试数据来帮助解决问题。

    这意味着您正在打破用户抽象级别并打开黑匣子!(FLOSS其实有透明盒子)。

一些有用的调试工具

一些......我的意思是,当你深入挖掘时,你会发现许多其他有用的工具。

  1. apport-bug 日志/核心转储/回溯

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

    apport-bug program-cmd --save bug-report_output.txt
    
    Run Code Online (Sandbox Code Playgroud)
  2. gdb 回溯/调试源代码

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

    $ gdb program-cmd
    (gdb) run
    (gdb) backtrace
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    对于基于 Ubuntu(Debian) 的发行版,可以使用以下方法下载软件包的源代码:

    apt-get source <package-name>
    
    Run Code Online (Sandbox Code Playgroud)
  3. strace 系统调用跟踪

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

    它自我介绍:

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

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

    来源: man strace

  4. ltrace 动态库调用跟踪

    ltrace是一个简单地运行指定命令直到它退出的程序。它拦截并记录被执行进程调用的动态库调用以及该进程接收到的信号。它还可以拦截和打印系统调用exe吗?被程序剪掉了。

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

    来源: man ltrace

  • 谢谢。`gdb -ex=run --args my_program arg1 arg2` 帮助我找到了问题。 (2认同)