我经常在 C 中调试数值例程。这意味着我使用 gdb 运行程序并单步执行要调试的函数。然后我通过使用 gdb 打印变量来将数值与我的期望进行比较。显然,这个过程对于较长的例程来说是乏味的。特别是,如果我更改例程并想与以前的结果进行比较,我需要记住后续运行之间不同变量的值。在某些情况下,如果我有一个工具可以自动将变量替换为执行期间遇到的数值,这将有很大帮助(特别是如果例程或多或少是线性的)。例如一个简短的(琐碎的)示例例程
myfunc(double a, double b)
{
double tmp_a, tmp_b, c;
tmp_a = a*a;
tmp_b = b*b;
c = sqrt(tmp_a+tmp_b);
return c;
}
可以转换为
myfunc(double a<1.0>, double b<2.0>)
{
double tmp_a, tmp_b, c;
tmp_a = a<1.0>*a<1.0>;
tmp_b = b<2.0>*b<2.0>;
c = sqrt(tmp_a<1.0>+tmp_b<4.0>);
return c<2.236067977499789696e+00>;
}
我可以使用 diff 工具轻松比较后续运行的输出。我还可以通过将输出粘贴到计算机代数系统中来将中间数值结果与任意精度结果进行比较。粗略的想法是,gdb驱动程序执行二进制文件直到指定的例程,逐步执行它(每次将一步中的所有变量替换为当时各自的值)并最终退出。非常欢迎对现有软件或实现想法的提示。也许有一个基于 perl 的解决方案,使用现有的 gdb 接口,例如Devel::GDB
(不确定这个是否足够成熟)。
似乎从版本 7 开始 gdb 支持 python 脚本。一个加载单线程可执行文件、设置断点、运行可执行文件并在达到断点后打印变量值的最小示例对我来说真的很有帮助。