3

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

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

我一直无法让调试器在 MonoDevelop 中工作(所以如果没有这些鬼问题,开发已经够困难了)。

Mono 不应该在托管环境中以防止此类问题吗?有什么办法可以缩小问题的根源吗?

4

3 回答 3

9

必须 (1) 使用 gdb 调试分段错误。要使用 gdb 调试单声道,您首先需要阅读.

完成后,启动程序,运行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 来散布您的代码。当一切都失败时,这是你最后的手段:)

于 2012-04-26T00:09:44.983 回答
0

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

我想得越多,如果您自己从不进行任何内存操作,那么段错误就不会出现在您的代码中。它可能在运行时,如果是这样,try/catchs 不会帮助你。

我的建议是充分利用文本和/或控制台日志记录,并逐行详细查看正在发生的事情。或者跳进视觉工作室并做一些跟踪。

于 2012-04-25T18:01:34.973 回答
-1

好吧,这一定是我的套接字线程的问题。我切换到使用 Begin/End 函数而不是自己处理线程并解决了这个问题。

于 2012-04-27T17:44:42.477 回答