我们能否始终针对崩溃问题获得正确(或完整)堆栈转储

时间:2015-04-15 09:27:01

标签: c debugging embedded-linux stack-trace callstack

很多时候我们在崩溃期间没有得到正确或完整的堆栈转储。我的问题是在所有情况下我们都可以看到这种情况发生。 可能是因为函数调用堆栈被破坏了。但是这种腐败是如何发生的。

我的第二个问题是我们如何调试这样的问题以及我们可以采取什么方法来找出崩溃的根本原因。

我理解我的问题可能没有确切的答案,但我想知道你的想法。

谢谢......

1 个答案:

答案 0 :(得分:1)

它是特定的操作系统和平台(即处理器)。

最好的方法是使用调试器来查找此类问题(可能是远程问题,了解gdbserver

我建议在桌面Linux系统上调试大部分代码(因为你有很多有用的工具:valgrindgcc -fsanitize=addressgdb等等......)< / p>

当然,call stack可能会被破坏到无法使用的程度。尝试memset堆栈段,然后从执行该功能的函数返回(无论您使用什么工具或技巧,堆栈在大多数平台上都会受到严重破坏)!

您可能会对GNU glibc backtrace functionGCC __builtin_return_addresslibbbacktrace by Ian Taylor in GCC

感兴趣

您也可以启用core转储并在事后分析它们(可能使用交叉调试器)。请参阅core(5)proc(5)setrlimit(2)