我想做这样的事情,但无法弄清楚正确的GDB命令。
我们说我开始调试一个进程,并且有一个文件我想作为参数传递给该进程。我想在运行时使用gdb命令脚本构造文件的名称,如下所示:
set $var1 = "path"
set $var2 = "to"
set $var3 = "file"
set $var4 = $var1+"/"+$var2+"/"+$var3
file /process/to/debug
run params $var4
答案 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 logging
与output
结合使用(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"
如果您对输入类型不特别并且在实际字符串上效果最佳,则此实现可能会做一些奇怪的事情。