2012-11-16 9 views
9

GDBでコード内のすべての行にブレークポイントを設定する方法はありますか?明らかに私はb *addrを1行ごとにヒットしたくないので、これを行うための速い方法があるのだろうかと思っています。GDB内のすべての行にブレークポイントを設定

編集 私は他の誰かによって作成されたバイナリを実行しており、ソースコードにアクセスできないことに注意してください。残念ながら、そのバイナリは-gフラグでコンパイルされていません。したがって、私はコード内の各行を1歩ずつ進めることはできません。ジェイソンは、以下の指摘するように

さらに編集 、あなたは確かにコードを通してシングルステップ限り、単にs(ステップ)またはn(次へ)とは対照的に、あなたが、siまたはniを使用してすることができます。しかしやsiのようなすべてのアセンブリ命令をステップ実行するのではなく、-gを指定せずにコンパイルしたバイナリでソースコードを実行すると、ソースコードが-gでコンパイルされていれば、nまたはsはうまく動作します。 。

+0

各ステップで何をしたいですか? 'list'の場合:http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

答えて

7

sistepi)を使用して、コードの手順を指示します。 ninexti)を使用して、関心のないライブラリ関数をステップオーバーすることができます。誤ってその中の1つに入ると、finishは元のルーチンに戻ります。このレベルで作業している人は、典型的には実行しようとしている次のいくつかの命令を表示するようにgdbを設定しています。 disp/3i $pc。そのアーチで

break-range start end 

+0

うわー、そのような簡単な解決策。私はniやsiの代わりにnとsを使っていました。完璧に動作します。私はGDBがniとnをどのように解釈するのか、興味があります。また、disp/3i $ pcは非常に役に立ちます。 – smaccoun

+1

'next'はデバッグ情報のソース行情報を使用して、ソース行のアドレス範囲を決定します。 10行目は0x100から0x116になる可能性があるため、デバッガ(舞台裏で)はpcが0x116になるまで命令ごとに命令を実行します。合併症には、別の関数にステップインしたり、現在の関数(returnコマンド、longjmp、例外がスローされた)を残すことが含まれます。この場合、実行を停止します。デバッガがサブルーチン呼び出しに入ると、元の関数にブレークポイントが設定され、処理が続行されます。舞台裏にはたくさんのものがあります。 'ni'は下位レベルです。 –

1

実行の最初の行にブレークポイントを置き、各行をステップ実行できませんか?これは、各行にブレークポイントを設定して何を達成しようとしているかによって異なります。式を評価したいのであれば、私の論理に従うことでそれを行うことができます。

+0

良い点。あなたは正しいですが、私は-gフラグを付けてコンパイルされていないバイナリを実行していると言っているのを忘れていました。私はソースコードにアクセスすることもできないので、-gで再コンパイルすることはできません。残念ながら、それは私に一歩を許さない。わかりやすく質問が編集されました – smaccoun

0

は、PowerPCはあったブレークポイント、およびGCBの提供のためのハードウェアをサポートしています。ですから、メモリアドレス全体、またはテキストセクション全体(テストされていない)を破ることができると思います。

x86ではコマンドが失敗します。

文書:https://sourceware.org/gdb/onlinedocs/gdb.html#index-break_002drange-1548

関連する問題