GNU/Linux >> Linux の 問題 >  >> Linux

セグメンテーション違反が発生した場合、Linux でスタック トレースを出力するプログラムを取得できますか?

解決策 1:

より良い方法があるかもしれませんが、この種の方法はそれを自動化します。

以下を ~/backtrace に入れます :

backtrace
quit

これを seg_wrapper.sh というスクリプトに入れます パス内のディレクトリ:

#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
    gdb -q $1 core -x ~/backtrace
fi

ulimit コマンドは、コアがダンプされるようにします。 "[email protected]" はスクリプトに与えられた引数なので、プログラムとその引数になります。 $?

gdb の場合 、 -q 静かな (イントロ メッセージなし)、および -x を意味します。 gdb を伝える 与えられたファイル内のコマンドを実行します。

使い方

したがって、それを使用するには、次のようにします:

seg_wrapper.sh ./mycommand and its arguments 

更新

これを行うシグナル ハンドラを作成することもできます。このリンクを参照してください。

解決策 2:

2年後にここに来て申し訳ありません...何か他のものを探しているときに偶然見つけました.完全を期すためにこれを追加します。

1)受け入れられた答えは素晴らしいと思いますが、gdbが必要です。私がよく知っている方法では、libSegFault.so を使用します。

でアプリを実行する場合

<ブロック引用>

LD_PRELOAD=...path-to.../libSegFault.so myapp

バックトレース、ロードされたライブラリなどを含むレポートが得られます

2) ラッパースクリプト catchsegv addr2line を使用しようとするものも利用可能です アドレスをファイル名 + 行番号に変換します。

これらは、コア ファイルや gdb よりもはるかに軽量なソリューションです (たとえば、組み込みシステムに適しています)。

解決策 3:

みんなの友達GDBが必要です

gdb <program> [core file]

コアファイルをロードしたら、コマンド 'backtrace' (省略して bt にすることができます) を実行すると、現在のコール スタックが表示されます。プログラムを gdb 内から実行すると、任意のブレークポイントを設定して、メモリの内容などを調べることができます。

解決策 4:

キャッチセグv

それは別の回答で言及されました(しかし、決して焦点を当てていません)。これは、glibc プロジェクトにバンドルされている便利なツールです。バックトレース (およびその他の有用なデバッグ情報) を提供するのは、次の場合のみです。 プログラムは実際に segfault を行います。

ここに良い記事があります。

必要に応じて独自のスクリプトに含めることができます。

解決策 5:

Ubuntu (プロジェクトとして) は、これを行うために Apport を使用します。彼らがどのようにそれを行ったかを見ることができます。

https://wiki.ubuntu.com/アポート


Linux
  1. Linux で Xcode を実行できますか?

  2. 行番号情報を含む gcc を使用して C++ のスタック トレースを取得するにはどうすればよいですか?

  3. Linux で悪意のある PDF を直接表示できますか?

  1. Linuxを始めたきっかけは何ですか?

  2. LinuxのIPツールでできる3つの便利なこと

  3. Linuxブートプロセス:開始するためのガイド

  1. Linux – 2018 Macbook Pro SSDを表示するためにLinuxの任意のバージョンを入手するにはどうすればよいですか?

  2. Linux CプログラムでpthreadのスレッドIDを取得するには?

  3. Xamarin で Linux アプリケーションを開発できますか?