小编tak*_*bal的帖子

跟踪未初始化的静态变量

我需要调试一个丑陋而庞大的数学C库,可能是由f2c生成的.代码滥用局部静态变量,不幸的是它似乎在某处利用了这些自动初始化为0的事实.如果使用相同的输入两次调用其入口函数,则它会给出不同的结果.如果我卸载库并重新加载它,它可以正常工作.它需要很快,所以我想摆脱加载/卸载.

我的问题是如何使用valgrind或任何其他工具发现这些错误,而无需手动遍历整个代码.

我正在寻找声明本地静态变量的地方,先读取,然后再写.由于静态变量有时会通过指针进一步传递(是的 - 它太丑了),这个问题更加复杂了.

我理解有人可以说这样的错误不应该被自动工具检测到,因为在某些情况下这恰好是预期的行为.还有,有没有办法让自动初始化的本地静态变量"脏"?

c valgrind static-analysis

7
推荐指数
1
解决办法
1303
查看次数

gdb漂亮的打印与直接函数调用

我正在尝试使用GDB的漂亮打印工具来显示自定义C++矩阵类.

这个课程非常标准,你可以在任何地方找到.它是一个按类型参数化的模板,可以用mat [i] [j]等C类表示法访问.这首先隐式返回表示行或列的另一个模板"Slice"类,[]运算符可以再次访问该类以提取数据.该类本身使用普通的C数组进行存储,但它正在实现一些技巧,比如预先分配更大的矩阵,启用非零启动,使用步幅等选项.该类没有本机打印接口,我无法修改它,或轻松链接我自己的代码.

自定义功能使得在Python中重现直接数据访问代码变得非常痛苦.但那有必要吗?一般来说:为什么漂亮的印刷会重现访问数据的逻辑?我不能只使用C++调用并使用[]运算符来打印第i,第j个元素吗?在这样的请求期间,Slice类在GDB中是临时的,这一事实使这更加复杂.

我也是python和GDB脚本的初学者.我试图破解示例用gdb.execute调用替换数据访问,但我不知道如何从to_string函数访问对象名称,所以我可以使用类似gdb.execute(??? +'[]的东西+ str(i)+']',False,True).

我想知道这样做的最有效方法是什么.

c++ python gdb pretty-print

6
推荐指数
1
解决办法
2028
查看次数

标签 统计

c ×1

c++ ×1

gdb ×1

pretty-print ×1

python ×1

static-analysis ×1

valgrind ×1