【问题标题】:Stack overflow in unmanaged: IP: 0x26eb76, fault addr: 0xbf808ffc非托管堆栈溢出:IP:0x26eb76,故障地址:0xbf808ffc
【发布时间】:2012-11-20 20:42:59
【问题描述】:

My Mono application 在 Mac 上崩溃并显示此消息 (Full log):

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

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

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

问题:如何调查此堆栈溢出?有什么技巧吗?

注意:相同的库(具有几乎相同的代码)在 Linux 和 Windows 上运行良好。

【问题讨论】:

    标签: mono monodevelop stack-overflow unmanaged monomac


    【解决方案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 here 调试单声道的技巧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多