2017-04-11 12 views
1

私はJavaから呼び出されているCコードをデバッグするためにgdbを使用しています。私は実行中のJavaプロセスにgdbを添付して動作します。幾分。最悪のことはGDBは定期的にSIGSEGVを報告しており、Javaをクラッシュさせることはありません。私は、JVMがダウンし、エラーに関する情報を含むhs_err_pidを生成することを期待します。私はそれらの欠陥が実際にgdbによって引き起こされているかどうか、実行中のコードで実際には起こっていないのか、あるいは状況によってはJavaがSIGSEGVから回復できるかどうか疑問に思っています。JavaのSIGSEGVはJVMをクラッシュさせることはできませんか?

編集:ここでは、完全なgdbの出力です:https://pastebin.com/Mk44kWXQ

例:

Thread 
52 "java" received signal SIGSEGV, Segmentation fault. 
0x00007f9f3a93d4b1 in ??() 
-exec-continue 
[New Thread 0x7f9ea4b46700 (LWP 10135)] 
[New Thread 0x7f9eb4079700 (LWP 10137)] 
[Thread 0x7f9eac95e700 (LWP 10130) exited] 

Thread 
52 "java" received signal SIGSEGV, Segmentation fault. 
0x00007f9f3a93d4b1 in ??() 
-exec-continue 
[Thread 0x7f9ea534c700 (LWP 9960) exited] 
+0

これはあまりにも曖昧だと思います。 gdbセッションの完全なターミナルダンプをインクルードする場合は、それはもっと紛らわしいかもしれません。 – unwind

+0

Java VMが別のサンドボックスでCコードを実行すると、サンドボックス内のsegフォルトがJava VMをクラッシュさせることはありません。 –

+0

@PaulOgilvie - これを実行したJavaの実装について聞いたことはありません。これはCとJavaの間の切り替えを高価にし、(かなりの程度)JavaからCを呼び出す目的を無効にします。 –

答えて

3

JavaでSIGSEGVはJVMがクラッシュすることができませんか?

Javaコード(ないネイティブコード)を実行しながら、SIGSEGVが発生した場合、確かにそれが原因のJava nullを参照解除する可能性が最も高いです。それはトラップされ、NullPointerExceptionになり、投げられます。アプリケーションはこれから回復できます。すなわち例外を「捕捉する」ことによって達成される。

JavaのスタックオーバーフローによってSIGSEGVがトリガされ、Javaコードがスタックの「赤いゾーン」メモリセグメントのアドレスを読み書きする可能性があると思います。

とにかく、JVMのSIGSEGVシグナルハンドラがSIGSEGVイベントをJava例外に変える可能性があるシナリオは間違いありません。もし起こらないのであれば、あなたはJVMのハードクラッシュだけを受けるでしょう。例えばイベントが発生したときにSIGSEGVをトリガしたスレッドがネイティブライブラリ内のコードを実行していた場合。

+0

OK、通常のJava NullPointerExceptionが発生する可能性があります。私は、NPEがsegfaultによって開始されたことを知らなかった、私はJVMが逆参照の前にチェックを行うと仮定した。ありがとう。 – Novotny

+1

実際には、JVMがヌルの逆参照を検出する方法に依存して実装されます。さまざまな戦略がありますが、JITコンパイラがさまざまな状況でさまざまな戦略を選択することを期待しています。 1つの戦略はnullをテストすることで、もう1つはSIGSEGVをトラップすることです。 –

関連する問題