IP:在非托管堆栈溢出0x26eb76,故障地址:0xbf808ffc(Stack overflow

2019-08-03 11:54发布

我的单应用程序崩溃在Mac上使用此消息( 完整日志 ):

$ mono --debug bin/Debug/SparkleShare.app/Contents/MonoBundle/SparkleShare.exe
[...]
Stack overflow in unmanaged: IP: 0x26eb76, fault addr: 0xbf808ffc
[...]

“在非托管”意味着堆栈溢出是不是在我的代码(我只有托管代码),而是在我嵌入(库的SQLite,DotCmis,NewtonSoft.Json ),或在Mono的代码。

即使我编译和调试模式下运行,我得到的是这两个十六进制数。

问:我怎样才能调查这个堆栈溢出? 任何把戏?

注意:相同的库(与几乎相同的代码)上运行Linux和Windows的罚款。

Answer 1:

处理堆栈溢出是相当棘手(单声道),所以它很可能是该堆栈溢出实际上是你的。 问题在于搞清楚堆栈跟踪。

我通常使用gdb运行:

gdb --args mono --debug bin/Debug/SparkleShare.app/Contents/MonoBundle/SparkleShare.exe

然后尝试按Ctrl + C堆栈开始增长后,但在此之前它实际上已经溢出(GDB变得​​与堆栈溢出严重混乱,你通常不得不退出GDB这种情况发生时,这就是为什么你会需要赶在行动中溢出)。

按下Ctrl + C后,做一个thread apply all backtrace ,你就会知道,如果一个堆栈溢出即将发生(一个线程将有成千上万的帧)。

一旦你在gdb一个巨大的堆栈跟踪,你需要确定的周期。 这通常是只要看一下堆栈跟踪的地址很容易。 一旦你有了这个数据,就可以得到这样的管理框架:

(gdb) p mono_pmip (0xdeaddead)
$1 = 0x0000dead  "Managed frame information shows up here"

然后,只需做同样为你找到了周期的所有帧。

有两种使用gdb调试单更多的技巧在这里 。



文章来源: Stack overflow in unmanaged: IP: 0x26eb76, fault addr: 0xbf808ffc