【发布时间】: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选项:stackoverflow.com/questions/1629685/…
标签: linux multithreading