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

C# 在没有任何调试器的情况下,如何在Ubuntu上调试Mono中的分段错误?,c#,mono,segmentation-fault,C#,Mono,Segmentation Fault,我有一个应用程序,我最近将其拆分为在单独的进程中运行,这些进程通过本地套接字相互通信。我将其拆分,希望增加稳定性,因为核心“观察者”进程可以检测故障并重新启动受影响的子进程 然而,现在我的watcher进程经常崩溃,只有消息“Segmentation Fault”。我在try/catch块中包围了所有线程操作,试图转储任何输出,但仍然得到相同的结果 我无法让调试器在MonoDevelop中工作(因此,如果没有这些鬼问题,开发已经足够困难了) Mono不应该在一个托管环境中防止这样的问题吗? 有什

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

然而,现在我的watcher进程经常崩溃,只有消息“Segmentation Fault”。我在try/catch块中包围了所有线程操作,试图转储任何输出,但仍然得到相同的结果

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

Mono不应该在一个托管环境中防止这样的问题吗?
有什么办法可以缩小问题的范围吗?

Mono是一个托管环境,这让我对您的问题感到非常奇怪。在什么情况下,您处理内存的方式实际上会导致seg故障?您是否有任何代码部分标记为“不安全”?如果你愿意,我会先看看那里。否则,可以将调试器附加到已经运行的进程。如果您没有调试Monodevelop,我会尝试这样做

我越想,如果你自己从来没有做过任何内存操作,seg错误就不会出现在你的代码中。它可能是在运行时,如果是这样,try/catch对您没有帮助

我的建议是充分利用文本和/或控制台日志记录,逐行详细了解正在发生的事情。或者跳到VisualStudio中进行一些跟踪

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

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

gdb程序PID

这将把gdb附加到您的程序中。您将看到一个gdb提示:

$ (gdb) 
执行以下操作(从您现在应该已经阅读的链接):

现在等待程序停止响应。当这种情况发生时,返回gdb,您将有希望发现您的程序已在分段错误(SIGSEGV)处停止,并且您应该能够获得有关崩溃的更多信息。这尤其有用:

$ (gdb) thread apply all backtrace
这将显示所有线程的堆栈跟踪


(1) 您还可以使用更粗暴的方式,通过调用Console.WriteLine来散布代码。这是你在其他一切都失败时的最后手段:)

嗯,一定是我的套接字线程问题。我转而使用Begin/End函数,而不是自己处理线程,这解决了问题。

听起来你应该尝试让调试器工作。当调试器不可用时,获取一个的选项通常是加载带有大量日志输出的代码,以缩小崩溃前它试图做的事情的范围,并推测出错的原因。我尝试让调试器工作了几天。除了自己构建monodevelop二进制文件(这是我真正想要避免的步骤)之外,这似乎是不可能的。我将尝试记录日志,但这段代码非常紧凑。几个简短的网络和监视线程,带有一个简单的文本IO GUI。故障发生之前经过的时间似乎是随机的(30秒到数小时),所以我担心这是一个基于数据的错误。Mono的哪个版本?任何低于2.10.1的版本都应该升级。我希望我有Visual Studio。不幸的是,我正在开发一个Ubuntu盒子。我没有使用任何不安全的代码,我正在监视我机器上的RAM。。。我从来没有把8GB的可用空间降到70%以下,所以也不能降到70%以下。例如,如果程序使用Windows的WinForms控件,可能会发生seg故障,因为Windows不完全兼容单声道。我在使用DockPanel套件时遇到过一次。所以,即使你不使用不安全的,它也可能发生。不,我使用的是Gtk。不过,谢谢。好了,终于实现了,我的代码中似乎没有一个调用堆栈。有很多对线程和互斥体的引用(mutices?),是的,本机堆栈跟踪不一定包含您的代码。此外,托管帧在默认情况下也不是符号化的,它们通常显示为许多???(您可以通过在gdb中使用
call mono\u pmip()
来获得符号,这在我链接到的文档中进行了解释)。-1。没有回答“在没有任何调试器的情况下,如何在Ubuntu上调试Mono中的分段错误?”
$ (gdb) thread apply all backtrace