次の質問:
C# の優れたクラッシュ レポート ライブラリ
Linux で同じことを行う CrashRpt.dll のようなライブラリはありますか? つまり、コア ダンプと必要な環境を含む障害レポートを生成し、開発者に通知しますか?
編集:これはこの質問の複製のようです
次の質問:
C# の優れたクラッシュ レポート ライブラリ
Linux で同じことを行う CrashRpt.dll のようなライブラリはありますか? つまり、コア ダンプと必要な環境を含む障害レポートを生成し、開発者に通知しますか?
編集:これはこの質問の複製のようです
スタック オーバーフローでの Unix システムでのスタック トレースの自動取得を参照してください。
デバッグ シンボルを使用してコードをコンパイルし、シェルで unlimit coredumpsize を入力すると、バイナリと同じフォルダーにコアダンプが取得されます。gdb/ddd を使用します。最初にプログラムを開き、次にコア ダンプを開きます。追加情報については、これを確認できます。
@Ionut
これはコア ダンプの生成を処理しますが、他のユーザーがクラッシュしたときに開発者に通知することは処理しません。
x86
注:セグメント フォールト クラッシュには、興味深いレジスタが 2 つあります。
最初のEIPは、例外が発生したコード アドレスを指定します。RichQ の回答では、addr2line を使用して、クラッシュ アドレスに対応するソース行を表示しています。ただし、EIP は無効な場合があります。null の関数ポインタを呼び出すと、 になる可能性があり0x00000000
、コール スタックを破損すると、戻り値によって任意のランダムな値が EIP にポップされる可能性があります。
2 番目のCR2は、セグメンテーション違反の原因となったデータ アドレスを示します。RichQ の例では、i をヌル ポインターとして設定し、それにアクセスしています。この場合、CR2 は になります0x00000000
。しかし、あなたが変更した場合:
int j = *i
に:
int j = i[2];
次に、 address にアクセスしようとしていますが0x00000008
、それが CR2 に表示されます。
ネイサン、あなたが間違っていると主張したわけではありません。Linux での (限られた) 経験では、セグメント ベースは常にゼロであると言っていました。多分それは私が尋ねる良い質問です...
@マーティン
私は x86 のアーキテクチャの検証を行っているため、プロセッサが提供するアーキテクチャには精通していますが、その使用方法にはあまり詳しくありません。それが私のコメントの根拠です。CR2が正しい答えを与えると期待できるなら、私は訂正されたままです.
ネイサン、セグメントベースがゼロでないのはどのような状況ですか? Linux アプリケーション開発に携わった 5 年間で、このようなことは一度もありませんでした。
ありがとう。