远程目标的GDB脚本流控制

时间:2017-04-04 23:00:12

标签: gdb remote-debugging

我想只在远程gdb目标上刷代码,如果它自上次运行gdb后已经改变了。我在gdb脚本中设想了以下内容;

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

...但是,我看不出如何对命令输出进行条件限制。

有人可以帮忙吗?我想我可能错过了什么,但我不知道是什么......

1 个答案:

答案 0 :(得分:0)

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

首先,定义一个名为$cmdeval的{​​{3}},它将执行gdb命令并将其输出作为字符串返回:

import gdb

class CmdEval(gdb.Function):
    """$cmdeval(str) - evaluate argument string as a gdb command
    and return the result as a string.
    """

    def __init__(self):
        super(CmdEval, self).__init__("cmdeval")

    def invoke(self, gdbcmd):
        return gdb.execute(gdbcmd.string(), from_tty=False, to_string=True)

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 again\n
 >end