在 gdb 中经过的时间

hus*_*ade 4 linux kernel gdb

有没有办法测量在 下运行程序所用的时间gdb

看看这个:

<------------bp---------------------------------->
Run Code Online (Sandbox Code Playgroud)

假设我们正在调试一个文件,并在某个随机位置设置了一个断点。现在gdb我们执行一些操作,然后我们使用gdb命令行 ( run)让程序继续执行。

我的问题在这里。我想测量从bp到程序成功结束或发生某些错误所用的时间。

我的建议是使用.gdbinit文件,在该文件中,我们调用一些 C 函数来在run命令之后启动计时器,并且在执行结束时我们还调用了gettime()C fun。

所以,我的伪代码有点像这样(.gdbinit文件):

break *0x8048452 (random place)
//start time
run
//get time
Run Code Online (Sandbox Code Playgroud)

Mar*_*ick 5

最简单的方法(如果你的 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)
Run Code Online (Sandbox Code Playgroud)

如果你的 gdb 没有 python 支持但可以运行 shell 命令,那么使用这个:

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

或者,您可以让目标进程调用gettimeofdayclock_gettime,但这会更加乏味。这些功能通过写进程的地址空间的变量,你很可能需要通过调用类似分配返回的时间malloc,并且可能无法正常工作,如果你的断点在另一个呼叫中间停止该程序mallocfree

  • @Hi-Angel 好点。命中断点后和程序退出后,需要尽快完成时间计算。不幸的是,当执行附加到断点的“命令”列表时,如果列表包含“继续”,则列表中该命令之后的任何命令都不会运行。因此,我们可能需要在预设脚本(“source”或“define”)中包含 run/time-calc/continue/time-calc 命令。我会修改我的答案。谢谢。 (2认同)