0

プログラム「./myprog」のトレースリスト全体を取得したい-GDB7.0-ubuntuを使用しています(私のアーキテクチャの新しいバージョンは存在しません)。私のGDBスクリプト( "./trace_list.gdb"):

gdb -q -x ./trace_list.gdb 


file ./myprog
set print address off
display/x $r0
display/x $r1
display/x $r2
display/x $r3
display/x $r4
display/x $r5
display/x $r6
display/x $r7
display/x $r8
display/x $r9
display/x $r10
display/x $r11
display/x $r12
display/x $sp
display/x $lr
display/x $fps
b *0x323d0
set logging on
run
while 1
x/i $pc
ni
end
quit

それは特定の瞬間にうまく機能します。次に書き込みます:

"./trace_list.gdb":26: Error in sourced command file:
Cannot access memory at address 0x6b980000

それ以上実行されません。

このエラーが発生するのはなぜですか?プログラムのトレースリスト全体を取得するにはどうすればよいですか?他のツールを使うべきでしょうか?わからない。

4

1 に答える 1

1

アドレス 0x6b980000 のメモリにアクセスできません なぜこのエラーが発生するのですか?

このエラーは、GDB が でメモリにアクセスしようとしたが、アクセス0x6b980000できなかったことを意味します (それは多くのことを教えてくれました ;-)

ほとんどの場合、ターゲット プロセッサ (どのプロセッサですか?) にはハードウェア シングルステップがありません (または、GDB はそれを使用する方法を知りません)。そのため、実行するためにni、GDB は次の命令であると判断したものに一時的なブレークポイントを設定します。GDB が間違いを犯した場合、または命令が GDB が書き込めないメモリ内にある場合 (カーネルの一部など)、あなたの負けです。

プログラムのトレース リスト全体を取得するにはどうすればよいですか?

トレース全体が実際に役立つことはめったにありません。命令が多すぎて、シングルステップのオーバーヘッドが大きすぎます。おそらく、このアプローチを放棄し、代わりに分割統治型デバッグを使用する必要がありますか?

アップデート:

「トレース全体が実際に役立つことはめったにありません」-プログラムが難読化されている場合でも?

はい、特にプログラムが難読化されている場合。

プログラムは、アンチデバッグ技術も採用している可能性があります。デバッガーの下で異なる動作をするプログラムを作成するのは非常に簡単で、実際のプログラム操作とは関係のないトレース全体を見るのに何時間も費やすことになるかもしれません:

if (running_under_debugger()) {
  compute_one_million_digits_of_pi();
} else {
  do_something_useful();
}
于 2012-04-18T03:41:29.460 に答える