连接GDB便利变量

时间:2016-12-01 18:16:29

标签: gdb

我想做这样的事情,但无法弄清楚正确的GDB命令。

我们说我开始调试一个进程,并且有一个文件我想作为参数传递给该进程。我想在运行时使用gdb命令脚本构造文件的名称,如下所示:

set $var1 = "path"
set $var2 = "to"
set $var3 = "file"
set $var4 = $var1+"/"+$var2+"/"+$var3
file /process/to/debug
run params $var4

2 个答案:

答案 0 :(得分:2)

没有非常好的内置方法可以做到这一点: - (

您可能会像我一样认为可以使用eval命令。但是,对于字符串替换的特定情况,eval需要低级(FWIW这对我来说似乎是一个gdb错误)。

即,这有效:

(gdb) set $v1 = 7
(gdb) eval "set $v2 = \"%d\"", $v1
(gdb) p $v2
$1 = "7"

但这不是:

(gdb) set $v3 = "hi"
(gdb) eval "set $v4 = \"%s\"", $v3
evaluation of this expression requires the target program to be active

您仍然可以使用两条路线。

传统的方法是将set loggingoutput结合使用(printf将无法正常工作 - 它会像上面那样失败)并且可能shell sed或者比如,将字符串转换为文件中的某些gdb命令。然后source该文件。

另一种方法是编写一些Python代码来执行此操作。您可以编写一个连接字符串的便捷函数,也可以编写一个新命令来执行您想要的任何操作。

答案 1 :(得分:0)

这个 gdb Python 用户定义的便利函数实现了一个 $concat 函数,您可以为此目的在任意右值上使用。

class Concat(gdb.Function):
    """$concat(arg, [arg, [arg, [...]]]): Concatenate strings"""

    def __init__(self):
        super(Concat, self).__init__("concat")

    def _unwrap_string(self, v):
        try:
            return v.string()
        except gdb.error:
            return str(v)
    
    def invoke(self, *args):
        return ''.join([ self._unwrap_string(x) for x in args])

Concat()
(gdb) source concat.py
(gdb) help function concat
$concat(arg, [arg, [arg, [...]]]): Concatenate strings
(gdb) p $concat(1,2,"foo",3,"bar")
$10 = "12foo3bar"
(gdb) p $concat( (char*)0 )
$14 = "0x0"
(gdb) $concat(argv[0])
$20 = "test_program"
(gdb) detach
...
(gdb) p $concat("works", " ", "when", " ", "detached")
$23 = "works when detached"

如果您对输入类型不特别并且在实际字符串上效果最佳,则此实现可能会做一些奇怪的事情。