Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Logging 创建用户定义的gdb命令以打印所有参数';日志文件中的值_Logging_Gdb_Eval - Fatal编程技术网

Logging 创建用户定义的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

在结合这两个目标之前,我首先尝试定义一个命令,将所有参数打印到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 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"