如何测试寄存器值在gdb中是否不可用?

逆向工程 数据库
2021-07-06 12:36:24

我正在使用一个.gdbinit 文件,它应该在每个 hook_stop 打印所有寄存器的值,然后是堆栈和数据帧。但是,在运行很多程序时,经常会出现段寄存器不可用的情况,这给我带来了问题。脚本在遇到这样的寄存器时中止。我收到错误消息:Error while running hook_stop: value is not available由于错误,剩余的段寄存器没有打印出来,堆栈和数据帧也没有打印出来。

我想知道是否有办法处理 gdb 脚本语言中的错误,或者更好的是,只需测试寄存器是否可用,如果可用则仅打印它。我试过了:

if $ds
    printf " %04X  ", $ds
else
    printf " ----  "
end

但这仍然给我错误。我通读了几个小时的文档,但找不到任何有用的东西。有任何想法吗?

1个回答

我已经弄清楚了。您可以通过 python 检查一个值是否可用:

我创建了一个方便的函数,你可以从你的调用它.gdbinit来轻松检查值是否可用。

将其保存在一个 python 文件中,并在您的.gdbinit

class IsValid (gdb.Function):
    def __init__ (self):
        super (IsValid, self).__init__("isvalid")

    def invoke (self, var):
        if var.__str__() == "<unavailable>":
            return 0
        else:
            return 1

IsValid ()

通过调用这个方便的函数,你可以分支来处理错误:

if ($isvalid($ds))
    printf " %04X  ", $ds
else
    printf " ----  "
end