2012-04-17 31 views
0

私のプログラム "./myprog"の全体トレースリストを取得したい - 私はGDB 7.0-ubuntuを持っています(私のアーキテクチャの新しいバージョンは存在しません)。 私のGDB-スクリプト( "./trace_list.gdb"):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 

これ以上実行しません。

このエラーはなぜ発生しますか? プログラムのトレースリスト全体を取得するにはどうすればよいですか?私は他のツールを使用する必要がありますか?私には分かりません。このエラーが発生しないのはなぜ

答えて

1

は、アドレス0x6b980000 でメモリにアクセスできませんか?

エラーがGDBが0x6b980000でメモリにアクセスしようとしたことを意味するが、(それがあるプロセッサ(あなたがそれだけ;-)

ほとんどの場合、あなたのターゲットプロセッサに語ったことができませんでした?)ハードウェアは、単一の欠けています-step(またはGDBはそれを使用する方法を知らない)ので、niを実行するために、GDBは次の命令であると考えるものに一時的なブレークポイントを設定します。 GDBが間違いを犯した場合や、命令がGDBが書き込めないメモリ(例えば、カーネルの一部)にある場合は、あなたは失われます。

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

実際には、トレース全体が非常に便利ではありません。命令が多すぎるため、シングルステップのオーバーヘッドが大きすぎます。おそらく、あなたはこのアプローチを断念し、代わりにdivide-and-conquer debuggingを使用する必要がありますか?

更新:

は「全トレースは、実際には非常にまれに便利です」 - プログラムは、難読化された場合でも?

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

このプログラムでは、アンチデバッグ技術も使用できます。デバッガの下で異なった動作プログラムを作るために非常に簡単です、あなたは、実際のプログラム動作とは何の関係もありません全体のトレースを見て時間を過ごすことがあります。

if (running_under_debugger()) { 
    compute_one_million_digits_of_pi(); 
} else { 
    do_something_useful(); 
} 
+0

「全トレースは実際には非常にまれに有用です」 - プログラムが難読化されている場合でも? –

+0

いくつかのブレークポイントの間にプログラムのトレースを取得すると便利です。しかし、「アドレスでメモリにアクセスできない」と、キーボードを破棄してモニタをウィンドウの外に出すように強制します。 P.S.プログラムは、記号的な情報なしで静的に(gcc - 静的に)組み立てられます。 –

+0

ありがとう、relpy! :) –

関連する問題