如何在没有任何调试器的情况下在Ubuntu上调试Mono中的分段错误?

时间:2012-04-25 17:05:42

标签: c# mono segmentation-fault

我有一个应用程序,我最近拆分为在单独的进程中运行,这些进程通过本地套接字相互通信。我希望通过提高稳定性将其拆分,因为核心“观察者”流程可以检测到故障并重新启动受影响的子流程。

但是,现在我的观察程序进程经常崩溃,只有“分段错误”消息。我已经将try / catch块中的所有线程操作包围起来以尝试转储任何输出,但我仍然得到相同的结果。

我无法让调试器在MonoDevelop中工作(因此,如果没有这些重影问题,开发就很困难了。)

是不是Mono应该在托管环境中来防止这样的问题? 有什么方法可以缩小问题的根源吗?

3 个答案:

答案 0 :(得分:8)

分段错误必须(1)使用gdb进行调试。要使用gdb调试mono,首先需要阅读this

完成后,启动程序,运行ps auxf以查找程序的pid,然后执行:

gdb program PID

这会将gdb附加到您的程序中。您应该看到一个gdb提示符:

$ (gdb) 

执行以下操作(从您现在应该阅读的链接开始):

$ (gdb) handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint
$ (gdb) continue

现在等到你的程序停止响应。当发生这种情况时,返回gdb,你会发现你的程序已经停止在分段错误(SIGSEGV),你应该能够获得有关崩溃的更多信息。特别是这很有用:

$ (gdb) thread apply all backtrace

将显示所有线程的堆栈跟踪。

(1)您还可以使用更强大的方式来调用您的代码来调用Console.WriteLine。当其他一切都失败时,这是你最后的选择:)

答案 1 :(得分:0)

Mono是一个托管环境,这让我的问题非常特别。在什么情况下你以一种实际导致seg错误的方式处理内存?您是否将代码的任何部分标记为unsafe?如果你这样做,我会先看看那里。否则,有一种方法可以将调试器附加到已经运行的进程。如果您没有调试Monodevelop,我会尝试这样做。

我想的越多,如果你自己从未做过任何内存操作,那么seg错误就不在你的代码中。它可能在运行时,如果是这样,try / catches不会帮助你。

我的建议是充分利用文本和/或控制台日志记录,并逐行详细了解最新情况。或者跳进视觉工作室并做一些痕迹。

答案 2 :(得分:-1)

嗯,它一定是我的套接字线程的东西。我转而使用Begin / End函数而不是自己处理线程并修复了问题。