gdb の経過時間

gdb の経過時間

プログラムの実行経過時間を測定する方法はありますかgdb?

これに注目してください:

<------------bp---------------------------------->

ファイルをデバッグしていて、ランダムな場所にブレークポイントを設定したとします。次に、 で何かを実行し、コマンド ライン ( )gdbを使用してプログラムの実行を続行します。gdbrun

私の質問はここです。bpプログラムが正常に終了するか、何らかのエラーが発生するまで続きます。

私の提案は、ファイルを使用することです.gdbinit。そのファイルでは、コマンドの後にタイマーを開始するための C 関数を呼び出しrun、実行の最後にgettime()C 関数も呼び出します。

したがって、私の疑似コードは次のようになります (.gdbinitファイル):

break *0x8048452 (random place)
//start time
run
//get time

答え1

これを行う最も簡単な方法は、次のとおりです (gdb が Python をサポートしている場合)。

break *0xaddress
run
# target process is now stopped at breakpoint
python import time
python starttime=time.time()
continue
python print (time.time()-starttime)

gdb に Python サポートがないが、シェル コマンドを実行できる場合は、以下を使用します。

shell echo set \$starttime=$(date +%s.%N) > ~/gdbtmp
source ~/gdbtmp
continue
shell echo print $(date +%s.%N)-\$starttime > ~/gdbtmp
source ~/gdbtmp

あるいは、ターゲットプロセスに呼び出しをかけることもできます日時を取得するまたはクロック取得時間ですが、これはかなり面倒です。これらの関数は、プロセスのアドレス空間内の変数に書き込むことによって時間を返しますが、これはおそらく のようなものを呼び出して割り当てる必要があり、ブレークポイントが別のまたはmallocの呼び出しの途中でプログラムを停止した場合は機能しない可能性があります。mallocfree

ただし、このソリューションにはちょっとした問題があります。continue 行と print result 行を続けて実行する必要があることです。そうしないと、タイミングが不正確になります。この問題を解決するには、「define」を使用してコマンドをスクリプトに組み込みます。 を実行するとdefine checkTime、gdb はコマンドのリストを入力するように求めます。上記のコマンド リスト (python/shell) のいずれかを入力すると、コマンド を使用するだけでスクリプトを呼び出すことができますcheckTime。そうすれば、タイミングが正確になります。さらに、define checkTimeとコマンドのリストをファイルに組み込む./gdbinitと、新しいプログラムを実行するたびに手動で再定義する必要がなくなります。

関連情報