我有一个应用程序,我最近将其拆分为在单独的进程中运行,这些进程通过本地套接字相互通信。我将其拆分是为了提高稳定性,因为核心“观察者”进程可以检测到故障并重新启动受影响的子进程。
但是,现在我的观察程序经常崩溃,只显示消息“Segmentation Fault”。我在 try/catch block 中包围了所有线程操作以尝试转储任何输出,但我仍然得到相同的结果。
我一直无法让调试器在 MonoDevelop 中工作(因此如果没有这些幽灵问题,开发已经很困难了)。
难道 Mono 不应该处于托管环境中以防止出现此类问题吗? 有什么方法可以缩小问题的根源?
最佳答案
段错误必须 (1) 使用 gdb 进行调试。要使用 gdb 调试单声道,您首先需要阅读 this .
完成后,启动您的程序,运行 ps auxf
找到您的程序的 pid,然后执行:
gdb 程序 PID
这会将 gdb 附加到您的程序中。你应该看到一个 gdb 提示符:
$ (gdb)
执行以下操作(从您现在应该已经阅读的链接):
$ (gdb) handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint
$ (gdb) continue
现在等到您的程序停止响应。发生这种情况时,返回 gdb,您会发现您的程序已在段错误 (SIGSEGV) 处停止,您应该能够获得有关崩溃的更多信息。这尤其有用:
$ (gdb) thread apply all backtrace
这将显示所有线程的堆栈跟踪。
(1) 您还可以使用更粗暴的方式通过调用 Console.WriteLine 散布您的代码。当一切都失败时,这是你最后的选择:)
关于c# - 如何在没有任何调试器的情况下调试 Ubuntu 上 Mono 中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320450/