私は2つのプログラム:A
とB
を持っています。それらは異なるプログラムであり、B
はA
のフォークではありません。 A
はB
を起動します。質問:B
のセグメンテーションフォールトのバックトレースをA
から取得できますか?私はB
プログラムのソースコードを変更することはできません。子プロセスのsegfaultバックトレースを取得する
答えて
彼らは異なるプログラムで、BはA. Aのフォークは "打ち上げ" とB
を起動していない、私はあなたがA
がfork
を行い、子供がB
execvp
を行うことを意味推測します
B
プログラムのソースコードを変更することはできません。
これは、あなたがB
のソースを持ってことを意味しますが、はそれを変更することはできませんが、はシンボルとのよりよいチャンスをデバッグ得るために-g
、-O0
と-fno-omit-frame-pointer
のような他のものとそれを再コンパイルすることができより正確なスタックトレースバック
しかし、これを解釈する別の方法は、B
をバイナリ実行可能ファイルとし、ではなく、にソースコードを付けることです。
私はまたがA
のソースを持っていると推測しています。
質問:AからBのセグメンテーション違反のバックトレースを取得できますか?
はい。いくつかの方法があります。
A
は、gdb
またはstrace
のようにB
を呼び出すとptrace
を使用できます。 B
segfaultsの場合、A
は制御を取得してスタックを戻って印刷することができます。
しかし、これはあなたの主な目的は[ちょうど] B
をデバッグすることですか? A
をfork/exec
のgdb B
にするのは、B
ではなく、gdb
のように簡単に行うことができます。スタックトレースバックは単純なgdb
コマンドで行われます。もっと簡単な方法は、シェルコマンドの制限を有効にしてからgdb
でコアファイルを調べることによってB
がコアをダンプできるようにすることです。
別の可能なオプション。 B
のシンボルは、readelf
と、必要な共有ライブラリのリストをldd
で参照してください。 B
に「フック」ポイントがあるかどうかを判断できます。つまり、open
のような共用ライブラリーから呼び出したいシンボル。
open
を含む特別な共有ライブラリを作成してから、B
に強制すると、環境変数LD_PRELOAD
が設定されます。次に、B
がopen
を呼び出すと、共有ライブラリが制御されます。その後、SIGSEGV
のシグナルハンドラをインストールしてから、dlsym
を使用して「実際の」オープンのアドレスを取得し、open
コールを終了します。
ここで、B
がsegfaultsの場合、特別な共有ライブラリのシグナルハンドラは、__builtin_return_address
などによってスタックを後戻りすることができます。 al。そして
は、さらに別の方法がB
実行ファイルをハックし、フックにA
私はバイナリ実行可能ファイルとして 'B'を持っています。 「A」は、オリンピック参加者をプログラムすることによって提供される他のプログラムを自動的にテストするプログラムです。ありがとう!私はあなたの提案されたすべてのソリューションを試してみます。 – melihovv
- 1. GDBバックトレース(子プロセス)
- 2. Python subprocess.Popen - アボート時に子のバックトレースを取得する方法
- 3. 他のスレッドのバックトレースを取得する
- 4. 子プロセスのフォームを取得する
- 5. 子プロセスとバックグラウンドを取得する
- 6. 子プロセスをPerlから取得する
- 7. 親プロセスから子プロセスを取得する方法
- 8. NodejsプロセスIDから子プロセスを取得する方法
- 9. 静的バイナリのAOSPのバックトレース取得
- 10. 子プロセスからPIDを取得
- 11. GDBのすべてのスレッドのバックトレースを取得する
- 12. PowerShellプロセスのプロセスIDを取得する
- 13. 親プロセスのid(minix)から子プロセスIDを取得するCプログラム
- 14. 子プロセスから親シェルの作業ディレクトリを取得する
- 15. ノードの子プロセスから値を取得する
- 16. 子プロセスのエラーと標準出力を取得する
- 17. シェルスクリプトでフォークされた子プロセスからプロセスID(pid)を取得する方法
- 18. liblttng-ust-cyg-profileなしでバックトレースを取得する
- 19. GLuintプログラムでsegfaultを取得する= glCreateProgram();アンドロイドネイティブアプリ
- 20. バックトレースからの受信者情報の取得
- 21. Python - インスタンスのプロセスIDを取得する
- 22. 別のプロセスを取得する 'QueryPerformanceCounter()
- 23. プロセスのアイコンを取得するmfc C++
- 24. 子プロセスが兄弟のPIDを取得することは可能ですか?
- 25. 与えられたPIDの子プロセスのリストをプログラムで取得する
- 26. Dockerコンテナ内の子プロセスの最大数を取得する方法は?
- 27. C#で特定の子プロセスからのみキーボードストロークを取得する方法
- 28. PowerShell、子プロセスのウィンドウハンドルを取得する方法、Visual Studioプロジェクトの例
- 29. d2:バックトレース情報を取得していない
- 30. Bash/ps:特定のプロセスの実行中の "myscript.sh"子プロセスのPIDを取得する
間違いなくあなたができると通信する方法を追加することである(パイプやソケット経由)
A
に戻って結果を伝えます。これを達成するための通常の方法は、プロセスの死後のスナップショットを含むコアダンプを有効にすることです。質問は、これがあなたに手頃な価格であるかどうかです... – user3159253