gdb:不干扰 "next" 或 "step" 的 "continue"
gdb: A "continue" that doesn't interfer with "next" or "step"
我目前正在通过 qemu 的 gdb 存根调试 syslinux(引导加载程序)。
最近,我编写了一些 gdb 命令,这些命令在每次动态(卸载)加载模块时(卸载)加载调试符号。为了不中断执行,我以 continue
.
结束命令
break com32/lib/sys/module/elf_module.c:282
commands
silent
python
name = gdb.parse_and_eval("module->name").string()
addr = int(str(gdb.parse_and_eval("module->base_addr")), 0)
gdb.execute("load-syslinux-module %s 0x%08x" % (name, addr))
end
continue
end
但是,逐行单步执行代码时,如果next
或step
命令让执行遇到了断点,则断点优先,执行命令,包括continue
。无论我进行了逐行调试,执行都会继续。如果我尝试跨过具有此断点的函数,也会发生这种情况。
如何在不干扰调试的情况下保持(卸载)动态加载调试符号?
是否有替代 continue
命令的方法?也许使用断点不是正确的方法?我会采取任何解决方案。
这无法通过 gdb CLI 完成。但是,从 Python.
开始很容易做到
在Python中最简单的方法就是定义自己的gdb.Breakpoint
子类,在其上定义stop
方法。这个方法可以做你喜欢的工作,然后return False
告诉gdb继续。
stop
工具旨在避免 commands
中 cont
的问题。有关详细信息,请参阅 the documentation。
我目前正在通过 qemu 的 gdb 存根调试 syslinux(引导加载程序)。
最近,我编写了一些 gdb 命令,这些命令在每次动态(卸载)加载模块时(卸载)加载调试符号。为了不中断执行,我以 continue
.
break com32/lib/sys/module/elf_module.c:282 commands silent python name = gdb.parse_and_eval("module->name").string() addr = int(str(gdb.parse_and_eval("module->base_addr")), 0) gdb.execute("load-syslinux-module %s 0x%08x" % (name, addr)) end continue end
但是,逐行单步执行代码时,如果next
或step
命令让执行遇到了断点,则断点优先,执行命令,包括continue
。无论我进行了逐行调试,执行都会继续。如果我尝试跨过具有此断点的函数,也会发生这种情况。
如何在不干扰调试的情况下保持(卸载)动态加载调试符号?
是否有替代 continue
命令的方法?也许使用断点不是正确的方法?我会采取任何解决方案。
这无法通过 gdb CLI 完成。但是,从 Python.
开始很容易做到在Python中最简单的方法就是定义自己的gdb.Breakpoint
子类,在其上定义stop
方法。这个方法可以做你喜欢的工作,然后return False
告诉gdb继续。
stop
工具旨在避免 commands
中 cont
的问题。有关详细信息,请参阅 the documentation。