我经常在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脚本。一个加载单个线程可执行文件、设置断点、运行可执行文件并在到达断点后打印变量值的最小示例将对我非常有帮助。
发布于 2013-02-20 12:47:13
如果在示例中打开优化,并且参数是代码中的常量,那么我希望编译器能够做到这一点,并简化整个过程,返回一个预先计算的平方根为5。
市场上有些产品做“代码流分析”,理解边界条件,“如果用负值调用sqrt是错误的”之类的。Coverity是一个在C/C++上做这件事的工具(不是任何免费的),它会说“你想在这里做一些蠢事,你确定这是对的吗?”键入您的代码的消息。
瓦兰也可以做类似的事情。
但是,这两个工具都不能为一组代码的运行注释变量的当前值。这是可以做到的,但与全速运行代码相比,这将是相当费时的,而且如果代码超过几百行运行几次迭代,那么可能要花费几乎永远的时间,并生成一个非常大的日志文件来说明在哪里发生的事情。一点也不相信这是可行的。
发布于 2013-02-20 12:54:47
你可以用另一种方式:
创建一个日志文件(可以通过printf完成并在运行时重定向standerd输出)。您可以从不同的运行中打印感兴趣的值和diff两个日志。
https://stackoverflow.com/questions/14979920
复制相似问题