2016-05-01 3 views
1

私は2つのプログラム:ABを持っています。それらは異なるプログラムであり、BAのフォークではありません。 ABを起動します。質問:BのセグメンテーションフォールトのバックトレースをAから取得できますか?私はBプログラムのソースコードを変更することはできません。子プロセスのsegfaultバックトレースを取得する

+1

間違いなくあなたができると通信する方法を追加することである(パイプやソケット経由)Aに戻って結果を伝えます。これを達成するための通常の方法は、プロセスの死後のスナップショットを含むコアダンプを有効にすることです。質問は、これがあなたに手頃な価格であるかどうかです... – user3159253

答えて

1

彼らは異なるプログラムで、BはA. Aのフォークは "打ち上げ" とB

を起動していない、私はあなたがAforkを行い、子供がB

execvpを行うことを意味推測します

Bプログラムのソースコードを変更することはできません。

これは、あなたがBのソースを持ってことを意味しますが、はそれを変更することはできませんが、シンボルとのよりよいチャンスをデバッグ得るために-g-O0-fno-omit-frame-pointerのような他のものとそれを再コンパイルすることができより正確なスタックトレースバック

しかし、これを解釈する別の方法は、Bをバイナリ実行可能ファイルとし、ではなく、にソースコードを付けることです。

私はまたAソースを持っていると推測しています。

質問:AからBのセグメンテーション違反のバックトレースを取得できますか?

はい。いくつかの方法があります。

Aは、gdbまたはstraceのようにBを呼び出すとptraceを使用できます。 B segfaultsの場合、Aは制御を取得してスタックを戻って印刷することができます。

しかし、これはあなたの主な目的は[ちょうど] Bをデバッグすることですか? Afork/execgdb Bにするのは、Bではなく、gdbのように簡単に行うことができます。スタックトレースバックは単純なgdbコマンドで行われます。もっと簡単な方法は、シェルコマンドの制限を有効にしてからgdbでコアファイルを調べることによってBがコアをダンプできるようにすることです。

別の可能なオプション。 Bのシンボルは、readelfと、必要な共有ライブラリのリストをlddで参照してください。 Bに「フック」ポイントがあるかどうかを判断できます。つまり、openのような共用ライブラリーから呼び出したいシンボル。

openを含む特別な共有ライブラリを作成してから、Bに強制すると、環境変数LD_PRELOADが設定されます。次に、Bopenを呼び出すと、共有ライブラリが制御されます。その後、SIGSEGVのシグナルハンドラをインストールしてから、dlsymを使用して「実際の」オープンのアドレスを取得し、openコールを終了します。

ここで、Bがsegfaultsの場合、特別な共有ライブラリのシグナルハンドラは、__builtin_return_addressなどによってスタックを後戻りすることができます。 al。そして

は、さらに別の方法がB実行ファイルをハックし、フックにA

+0

私はバイナリ実行可能ファイルとして 'B'を持っています。 「A」は、オリンピック参加者をプログラムすることによって提供される他のプログラムを自動的にテストするプログラムです。ありがとう!私はあなたの提案されたすべてのソリューションを試してみます。 – melihovv

関連する問題