2

SIGSEGVに外部プログラムを引き起こす命令のアドレスを取得したい。これにptraceを使用しようとしましたが、カーネルスペースからEIPを取得しています(おそらくデフォルトのシグナルハンドラーですか?)。GDBはどのようにして正しいEIPを取得できますか?

APIを使用してGDBにこの情報を提供させる方法はありますか?

編集:私はプログラムのソースを持っていません、バイナリ実行可能ファイルだけを持っています。自動化が必要なので、GDBで「実行」や「情報レジスタ」を単純に使用することはできません。自分のミニデバッガに「情報レジスタ」を実装したい:)

4

4 に答える 4

2

ptrace を使用してプロセスに接続できます。Linux Gazette で記事を見つけました。

レジスターには PTRACE_GETREGS が必要なようです。strace のようなサンプル コードを見て、シグナル処理などを管理する方法を確認する必要があります。ドキュメントを読むと、トレースされた子はすべてのシグナルで停止し、トレースの親wait()は子からのシグナルに対して、PTRACE_CONT を使用し続けるように命令する必要があるように見えます。

于 2010-06-16T02:19:27.967 に答える
0

コア ダンプを作成してから、gdb で分析してみてください。'automate' を使用して、キーを 1 回押すだけで gdb にすべてのコマンドを実行させたい場合は、gdb もそれを行うことができます。コマンドをファイルに入力し、ヘルプのマニュアルのユーザー定義セクションを調べます。gdb は既定のコマンドを処理できます。

于 2010-06-15T22:33:37.283 に答える
0

-gプログラムを、 run gdb <your_app>、 typeでコンパイルするrunと、エラーが発生します。その後、使用info registersしてレジスターを調べますrip

を使用objectdump -D <your_app>して、その位置のコードに関する詳細情報を取得できます。

于 2010-06-15T22:05:52.420 に答える
0

ulimit -c unlimited外部プログラムを実行する前に、コア ダンプを有効にすることができます。

次に、クラッシュ後にコア ダンプ ファイルを調べることができます。gdb /path/to/program corefile

これはバイナリであり、デバッグ オプションを使用してコンパイルされていないため、レジスタおよびマシン コード レベルで詳細を表示する必要があります。

于 2010-06-15T22:20:47.123 に答える