当回溯从零开始时如何调试崩溃

Posted

技术标签:

【中文标题】当回溯从零开始时如何调试崩溃【英文标题】:How to debug crash, when backtrace starts with zero 【发布时间】:2018-11-04 20:25:47 【问题描述】:

我长时间运行的应用程序随机崩溃并出现分段错误。在尝试调试生成的核心转储时,我遇到了奇怪的堆栈跟踪:

(gdb) bt full
#0 __memmove_ssse3 () at ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S:2582
No locals.
#1 0x00000000 in ?? ()
No symbol table info available.

怎么会发生,回溯从 0x00000000 开始? 我该怎么做才能更多地调试这个问题?我无法在 gdb 中运行它,因为它甚至可能需要一周时间才能发生崩溃。

【问题讨论】:

某些东西破坏了堆栈指针。这真的很糟糕。你将不得不从另一边接近这个并分而治之,以缩小坠机现场和真正的杀手。开始在代码中植入日志消息,看看程序在崩溃之前能走多远。使用收集到的信息来改进日志消息或添加更多信息。是的,如果您可以通过一些日志消息跟踪并杀死它!但如果你不能,当你对正在发生的事情有更好的了解时,回到 gdb 并在有利的位置设置断点。 您是否在 UNIX/Linux 操作系统上运行? @tk421 是的,特别是在 CentOS 7 上。 【参考方案1】:

通常这意味着堆栈上的返回地址已被 0 覆盖,可能是由于超出了堆栈数组的末尾。您可以尝试在 gcc 或 clang 上使用地址清理器进行构建(如果您正在使用它们)。或者您可以尝试使用 valgrind 运行,看看它是否会告诉您无效的内存写入。

【讨论】:

谢谢,地址消毒剂似乎很有趣。有没有办法告诉它只报告堆栈缓冲区溢出?

以上是关于当回溯从零开始时如何调试崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从零开始学回溯算法

从零开始学算法——回溯

从零开始学习MySQL调试跟踪

从零开始学习MySQL调试跟踪

从零开始学习MySQL调试跟踪

学习笔记GAN001:生成式对抗网络,只需10步,从零开始到调试