远程目标的 GDB 脚本流控制



如果自上次运行 gdb 以来代码已更改,我只想在远程 gdb 目标上刷新代码。我在 gdb 脚本中设想了类似以下内容的内容;

target extended-remote /dev/<device>
<Attach to Target>
file <Target Program>
if ![compare-sections -r]
    load
start

。但是,我看不到如何在命令输出上设置条件。

谁能帮忙?我想我可能错过了一些东西,但我不知道是什么......

compare-sections 命令不返回可在 if 语句中使用的值,但以下内容可能会执行您想要的操作。

首先,定义一个名为 $cmdeval 的便利函数,该函数将执行 gdb 命令并将其输出作为字符串返回:

import gdb
class CmdEval(gdb.Function):
    """$cmdeval(str) - evaluate argument string as a gdb command
    and return the result as a string. Trailing newlines are removed.
    """
    def __init__(self):
        super(CmdEval, self).__init__("cmdeval")
    def invoke(self, gdbcmd):
        return gdb.execute(gdbcmd.string(), from_tty=False, to_string=True).rstrip('n')
CmdEval()

您可以将其放入名为 cmdeval.py 的文件中,然后键入 (gdb) source cmdeval.py 以将其加载到 gdb 中。

接下来,由于compare-sections输出"MIS-MATCHED"任何已更改的部分,您可以使用 $_regex 方便函数查找该字符串,该函数包含在最新版本的 gdb 中:

(gdb) if $_regex($cmdeval("compare-sections -r"),".*MIS-MATCHED.*")
 >echo need to load againn
 >end

最新更新