Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接GDB方便变量_Gdb - Fatal编程技术网

连接GDB方便变量

连接GDB方便变量,gdb,Gdb,我想做类似的事情,但无法找到正确的GDB命令 假设我开始调试一个进程,我想将一个文件作为参数传递给该进程。我希望在运行时使用gdb命令脚本构造文件名,该脚本如下所示: set $var1 = "path" set $var2 = "to" set $var3 = "file" set $var4 = $var1+"/"+$var2+"/"+$var3 file /process/to/debug run params $var4 没有真正好的内置方法可以做到这一点:-( 您可能认为,正如我所做

我想做类似的事情,但无法找到正确的GDB命令

假设我开始调试一个进程,我想将一个文件作为参数传递给该进程。我希望在运行时使用gdb命令脚本构造文件名,该脚本如下所示:

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

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

您可能认为,正如我所做的,可以使用
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代码来实现这一点。您可以编写一个连接字符串的便利函数,也可以编写一个新命令来执行您想要执行的任何操作。

这个gdb Python用户定义的便利函数实现了一个用于任意右值的
$concat
函数

类Concat(gdb.Function):
“$concat(arg,[arg,[arg,[…]]):连接字符串”
定义初始化(自):
超级(Concat,self)。\uuuuu init\uuuuuuuuu(“Concat”)
def_展开_字符串(自身,v):
尝试:
return v.string()
除gdb.error外:
返回str(v)
def调用(self,*args):
返回“”。加入([self.\u unwrap\u args中x的字符串(x)])
Concat()

如果您对输入类型不太了解,并且在实际字符串上效果最好,那么这个实现可能会做一些奇怪的事情。

谢谢。是的。在gdb中编写脚本不是最好的。我可能应该减少损失,选择python。
(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"