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

标签 c# mono segmentation-fault

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

但是,现在我的观察程序经常崩溃,只显示消息“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/

相关文章:

c - 访问作为 void 指针段错误传递的 int 数组

c - JACK 语言的 Lexer 中的段错误

c++ - 带有字符串数组的段错误c++

C# Treeview 键全路径

c# - 根据概率从一系列值中随机选取一个数字

shell - 如何在 IronPython/Mono 中运行 OS shell 命令?

c# - Mono 上的垃圾收集最坏情况性能

c# - Mono、C# 和 Glade 入门# : How to make window appear?

c# - 通用 Windows 应用程序如何拥有多个独立窗口(如 Microsoft 的应用程序 “Photos” )?

c# - 使用 Entity Framework 的规范模式(按属性排序)