GDB:有没有什么方法来构建;“本地”;方便变量?

GDB:有没有什么方法来构建;“本地”;方便变量?,gdb,Gdb,我有一个实时OO程序(尽管是用C编写的),我正试图调试它。我有一个问题,数千个对象中的某些对象在特定的时间段内,时不时地被损坏。我希望在窗口的开头有一个断点,它会自动在成员变量上设置一个观察点,然后在窗口的末尾由另一个断点删除该观察点。问题是我需要某种方法将观察点编号与给定对象绑定。如果我可以通过某种机制构造一个方便变量,例如,如果$var=28,那么set$x${var}=watch-l foo将等同于set$x28=watch-l foo。(实际上不起作用)这将允许我这样做: breakpo

我有一个实时OO程序(尽管是用C编写的),我正试图调试它。我有一个问题,数千个对象中的某些对象在特定的时间段内,时不时地被损坏。我希望在窗口的开头有一个断点,它会自动在成员变量上设置一个观察点,然后在窗口的末尾由另一个断点删除该观察点。问题是我需要某种方法将观察点编号与给定对象绑定。如果我可以通过某种机制构造一个方便变量,例如,如果
$var=28
,那么
set$x${var}=watch-l foo
将等同于
set$x28=watch-l foo
。(实际上不起作用)这将允许我这样做:

breakpoint obj_init+23
command
  $var = *obj
  $x${var} = watch -l foo
  continue
done

breakpoint obj_final
command
  $var = *obj
  delete $x${var}
  continue
done
因此,我不会(希望)超出可用硬件观察点的数量

有人知道我如何在不编写python扩展的情况下实现这一点吗?(我的python非常生疏。)

您可以使用GDB的命令来设置和使用名称由数字或字符串表达式的结果组成的变量

您可以将eval看作是对其参数进行一次排序,然后执行结果字符串
eval“set var$x%d=1”,5
将运行命令
set var$x5=1

您需要的另一条信息是,与所有断点命令一样,该命令将方便变量
$bpnum
设置为断点编号

break obj_init+23
commands
  set var $var = *obj
  watch -l foo
  eval "set var $x%d = $bpnum", $var
  continue
done

break obj_final
commands
  set var $var = *obj
  eval "delete $x%d", $var
  continue
done

你试过瓦尔格林吗?似乎更容易设置,通常有助于解决数据损坏问题。我认为没有python是不可能的。另外,我也同意你应该先用valgrind或消毒剂试试。valgrind没用。主要是因为我在python下运行一个由glib对象组成的gstreamer管道,它们对内存处理都做了奇怪的事情。在一整天的尝试之后,我没能得到一个有用的运行,是的,我已经阅读了有关每个框架的valgrind文档。至于清洁剂,我认为它们(还)没有在我的gcc平台上启用。我需要在CentOS上运行这些测试,并在编译器上运行这些落后多年的测试。谢谢!我不知道“eval”命令!