import gdb
import time
class CmdAutoStep (gdb.Command):
"""Auto-Step through the code until something happens or manually interrupted.
An argument says how fast auto stepping is done (1-19, default 5)."""
def __init__(self):
print('Registering command auto-step')
super(CmdAutoStep, self).__init__("auto-step", gdb.COMMAND_RUNNING)
gdb.events.stop.connect(stop_handler_auto_step)
def invoke(self, argument, from_tty):
try:
frame = gdb.newest_frame()
except gdb.error:
raise gdb.GdbError("The program is not being run.")
number = 5 # optional: use a parameter for the default
if argument:
if not argument.isdigit():
raise gdb.GdbError("argument must be a digit, not " + argument)
number = int(argument)
if number == 0 or number > 19:
raise gdb.GdbError("argument must be a digit between 1 and 19")
sleep_time = 3.0 / (number * 1.4)
global last_stop_was_simple
last_stop_was_simple = True
pagination = gdb.execute("show pagination", False, True).find("on")
if pagination:
gdb.execute("set pagination off", False, False)
try:
while (last_stop_was_simple):
gdb.execute ("step")
time.sleep(sleep_time)
except KeyboardInterrupt as ki:
if pagination:
gdb.execute("set pagination on", False, False)
except gdb.GdbError as user_error:
if pagination:
gdb.execute("set pagination on", False, False)
# pass user errors unchanged
raise user_error
except:
if pagination:
gdb.execute("set pagination on", False, False)
traceback.print_exc()
def stop_handler_auto_step(event):
# check the type of stop, the following is the common one after step/next,
# a more complex one would be a subclass (for example breakpoint or signal)
global last_stop_was_simple
last_stop_was_simple = type(event) is gdb.StopEvent
CmdAutoStep()
Gdb 的 CLI 支持
while
循环。没有内置sleep
命令,但您可以调用 shell 来运行sleep
程序,或者使用 gdb 的内置 python 解释器(如果有的话)。它可以用 Control-C 中断。方法一:
方法二:
方法3(定义宏):
expect
可以自动化这个或者如果程序有耗尽的风险,
s
你可以重复gdb
它,但会更复杂一些您可以在命令中使用 shell 管道;这是想法:
gdb 从管道中读取命令;它每隔一秒无限地看到一个“step”命令。
您可能想设置一些断点并运行程序;调整口味:
当前接受的答案总是
step
,一旦开始,因此也“跳过”断点、信号甚至程序结束(在最后一种情况下,在 gdb 内部中止while
发生的位置之前引发单个错误“程序未运行”) .作为另一个罪魁祸首,一旦 GDB 输出“满”,如果分页打开(这是默认设置),它就会停止。
使用 python api 这可以很好地处理:
stop
事件处理程序,检查停止原因并将步骤类型存储在那里以下代码可以放在 gdb-auto-step.py 中,您可以随时激活
source gdb-auto-step.py
它(或包含在 .gdbinit 文件中以使其始终可用):