2012-04-25 8 views
2

私は最近、ローカルソケットを介して互いに通信する別々のプロセスで実行するために分割したアプリケーションを持っています。コアウォッチャープロセスが障害を検出し、悩まされたサブプロセスを再起動できるように、安定性を高めるために分割しました。デバッガなしでUbuntuのMonoでセグメンテーションフォールトをデバッグする方法は?

しかし、ウォッチャープロセスは、「セグメンテーションフォルト」というメッセージだけで頻繁にクラッシュします。私はすべてのスレッド操作をtry/catchブロックに囲んで出力をダンプしようとしましたが、同じ結果が得られます。

私はMonoDevelopでデバッガを動作させることができませんでした(開発にはこれらのゴーストの問題がなくても十分に難しかったです)。

Monoはこのような問題を防ぐために管理された環境になっていませんか? 問題の原因を絞り込む方法はありますか?

+2

デバッガを動作させようとしているように思えます。 – ricochet1k

+1

デバッガが利用できない場合、通常、取得するオプションは、クラッシュ前に何をしようとしていたのかを明らかにするために、ロギング出力の多いコードをロードし、何が間違っているのかを推測します。 –

+0

私はデバッガを数日間働かせようとしました。モノデベロッパーバイナリを自分で作成するのは短期間です(これは避けたいステップです)、不可能に思えました。 –

答えて

-1

まあ、それはソケットのスレッディングであるに違いありません。私は自分自身を処理する代わりにBegin/End関数を使用するように切り替えて、問題を修正しました。

+0

-1。 「デバッガなしでUbuntuのMonoでセグメンテーション違反をどのようにデバッグするのですか?」という質問には答えません。 –

0

モノは管理された環境であり、あなたの質問は本当に私にとって独特です。どのような状況下で実際にsegフォルトを引き起こす方法でメモリを扱っていますか? unsafeと記されたコードの部分はありますか?あなたがそうするなら、私は最初にそこに目を向けるでしょう。それ以外の場合は、既に実行中のプロセスにデバッガを接続する方法があります。 Monodevelopからデバッグしていない場合、私はそれを試みます。

あなたが自分で決してメモリ操作をしないと、segフォールトはあなたのコードになることはありません。それはおそらく実行時にあります。もしそうなら、try/catchはあなたを助けません。

私の提案は、テキストやコンソールロギングをうまく利用して、何が起きているかを詳細に調べることです。またはビジュアルスタジオでホップし、いくつかのトレースを行います。

+0

私はVisual Studioを使いたがっています。残念ながら私はUbuntuの箱に取り組んでいます。私は安全でないコードを使用していません。マシンのRAMを見ています...私は8GBの空き容量の70%を下回ることはありません。 –

+0

segフォールトは、たとえば、プログラムがWindowsからのWinFormsコントロールを使用していて、完全にMono互換でない場合に発生します。私はDockPanel Suiteを使うときに一度それを知りました。したがって、安全でない場合でも、それは起こり得る。 –

+0

いいえ、Gtk#を使用しています。しかし、ありがとう。 –

7

セグメント違反は、(1)gdbを使用してデバッグする必要があります。 gdbを使ってモノをデバッグするには、まずthisを読む必要があります。それが終わったらだ

、あなたのプログラムのPIDを見つけるために、ps auxfを実行して、あなたのプログラムを起動し、実行します。

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を呼び出すと、コードを散りばめることができます。これはあなたの最後の手段です。他のすべてが失敗したときです。

+0

さて、これが動作するようになりました。私のコードには1つのコールスタックがないようです。スレッドとmutex(mutices?)への参照はたくさんあります。 –

+0

ネイティブスタックトレースに必ずコードが含まれているとは限りません。また、管理されたフレームはデフォルトではシンボリックではありませんが、通常は多くの????のように表示されます(ただし、gdbの 'call mono_pmip()'を使用してシンボルを取得できます)。にリンク)。 –

関連する問題