3

illegal operandプログラムを実行するとエラーが発生します。クラッシュが発生するプログラムは、アセンブリで記述され、オブジェクトファイルとしてリンクされているため、使用方法がわかりませんgdb。信号をトラップして障害に気づきましたSIGILL。問題のある命令のアドレスを取得したいと思います。私の頭に浮かぶ方法の1つは、シグナルハンドラーで最後の実行コンテキストを取得し、ripそこからレジスターの値を書き留めることです。コンテキストがシグナルハンドラーに渡されることは知っていますが、方法がわかりません。

4

2 に答える 2

5

シグナルハンドラールートをたどりたい場合は、シグナルハンドラーを実行させる命令のアドレスを取得するのは難しくありません。シグナルハンドラーを作成するときSA_SIGINFOは、フラグ設定のビットを設定します。次に、ハンドラーを作成すると、例外をトリガーしたメモリ位置のアドレスであるsiginfo_tフィールドを含む構造にアクセスできるようになります。si_addr

于 2012-04-28T17:48:48.327 に答える
0

アセンブリで記述され、オブジェクトファイルとしてリンクされているため、gdbを使用する方法がわかりません。

GDBは、アセンブリコードのデバッグに最適です。あなたが欲しいでしょうinfo registersx/i $pc

私の頭に浮かぶ方法の1つは、シグナルハンドラーで最後の実行コンテキストを取得し、そこからripregisterの値を書き留めることです。

それは問題ありません(コンテキストを取得する方法については、Gabrielの回答を参照してください)。

これにより、クラッシュポイントでGDB内に表示される情報と比較して追加情報が得られないことに注意してください。そもそもGDBの使用方法がわからない場合は、シグナルハンドラーでコンテキストを取得することで何が得られるかわかりません。

于 2012-04-28T19:23:24.660 に答える