Linux coredump 回溯丢失帧
Posted
技术标签:
【中文标题】Linux coredump 回溯丢失帧【英文标题】:Linux coredump backtrace missing frames 【发布时间】:2014-09-27 15:34:39 【问题描述】:我从多线程进程分段错误崩溃中得到核心转储。在使用 GDB 检查核心文件时,我发现一些线程(不是全部)具有这样的回溯:
Thread 4 (LWP 3344):
#0 0x405ced04 in select () from /lib/arm-linux-gnueabi/libc.so.6
#1 0x405cecf8 in select () from /lib/arm-linux-gnueabi/libc.so.6
#2 0x000007d0 in ?? ()
#3 0x000007d0 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
我检查了我们的源代码,发现这些线程最终确实调用了 select()。我想了解为什么/如何省略这些中间框架。
read() 调用也会出现这种模式。
知道这里发生了什么吗?恐怕这表明我们的 coredump 配置有问题,或者其他什么。提前感谢您的帮助!
编辑: 感谢所有回复。我很抱歉我没有提供足够的信息。这里有更多: 可执行文件是用编译器 -g 构建的,没有任何优化,使用 -O0。 我们通常只使用不到一半的 RAM 300-400 MB/1G。 实际上,我还在不同的核心文件中看到了这种模式回溯(针对不同的故障转储)。 使这种症状真正连线的原因(不同于普通的堆栈损坏)是多个线程具有这样的回溯模式,帧#0、#1 与此完全相同,但#2 #3 地址可能与此不同。
【问题讨论】:
看到关于“损坏堆栈”的问题了吗?在我看来,您有内存问题,因为您覆盖了不属于您的内存,更具体地说是在堆栈上。您是否正在编写超出数组范围的内容?尝试使用Valgrind 运行带有调试信息的版本。 如果堆栈确实损坏并且您使用gcc
编译程序,请考虑使用 -fstack-protector-all
选项:***.com/questions/1629685/…
【参考方案1】:
看起来您可能在未启用调试的情况下进行编译。
确保在编译时传入-g
。
此外,正如 Joachim Pileborg 在他的评论中提到的那样,重复的堆栈帧意味着您可能在某个地方损坏了堆栈。这通常是在数组末尾写入存储的帧指针的结果。
【讨论】:
没有 -g 他不应该看到任何 bt。 @rakib,这不是真的。真实的是bt
不会给出行号。试着写一个segfaulting程序,不用-g
编译,然后在segfault后在gdb
和bt
下运行。
哦,是的。你说得对,实际上我忘记了段错误(即 coredump),我正在考虑典型的程序。【参考方案2】:
如果您想检查由于内存相关问题而导致的分段错误,或者想要检查内存泄漏,则最好使用 Valgrind,它会提供有关内存泄漏的所有信息。
【讨论】:
以上是关于Linux coredump 回溯丢失帧的主要内容,如果未能解决你的问题,请参考以下文章