我的单应用程序崩溃在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的罚款。
处理堆栈溢出是相当棘手(单声道),所以它很可能是该堆栈溢出实际上是你的。 问题在于搞清楚堆栈跟踪。
我通常使用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调试单更多的技巧在这里 。