Logging 创建用户定义的gdb命令以打印所有参数';日志文件中的值
在结合这两个目标之前,我首先尝试定义一个命令,将所有参数打印到gdb控制台:Logging 创建用户定义的gdb命令以打印所有参数';日志文件中的值,logging,gdb,eval,Logging,Gdb,Eval,在结合这两个目标之前,我首先尝试定义一个命令,将所有参数打印到gdb控制台: define printall set $n = 0 while $n < $argc eval "print $arg%d", $n set $n = $n + 1 end end 一旦这项功能正常运行,我想定义另一个用户定义的命令,该命令将评估gdb命令并将其输出打印到日志文件中,类似于: define logcmd if $argc >= 2 set logg
define printall
set $n = 0
while $n < $argc
eval "print $arg%d", $n
set $n = $n + 1
end
end
一旦这项功能正常运行,我想定义另一个用户定义的命令,该命令将评估gdb命令并将其输出打印到日志文件中,类似于:
define logcmd
if $argc >= 2
set logging on
set logging file $arg0 # <-- does this guy need to be quoted?
set logging overwrite on
set logging redirect on
set $n = 1
while $n < $argc
eval "$arg%d", $n
set $n = $n + 1
end
set logging off
end
end
但我似乎在这里遗漏了一些基本的东西(使用
eval
maybe?),给出了什么?Gdb通过简单的文本替换扩展用户定义的CLI命令中的参数。执行行之前,每行中出现的$arg0
、…、$arg9
和$argc
都会被替换1。甚至在双引号字符串中也会发生替换,因此eval“x/$arg1xg$arg0”
会满足用户的期望2
不过,Gdb不会将$arg%d
视为可以替代的东西
但它在GDB8.0(或Ubuntu上的GDB7.12.50)中工作得更好。尽管gdb在通过用户定义的命令时仍然不会替换eval“print$arg%d”、$n
中的任何参数,但在执行内部printf
之后,在执行生成的命令之前,它会为所有eval
命令添加一个额外的替换过程
因此,简单的回答是,您的代码将在GDB8.0中工作
你的另一个问题是:
设置日志文件$arg0#
define logcmd
if $argc >= 2
set logging on
set logging file $arg0 # <-- does this guy need to be quoted?
set logging overwrite on
set logging redirect on
set $n = 1
while $n < $argc
eval "$arg%d", $n
set $n = $n + 1
end
set logging off
end
end
logcmd values.log "printall abs_tol point_a interval"