当print-debugging改变程序行为时,如何处理调试C ++代码

时间:2014-06-04 14:29:34

标签: c++ debugging gcc clang++

我正在使用一个相当成熟的大型C ++项目(10年以上的开发,150k + SLOC,3k +测试用例,www.sumo-sim.org)。我们最近发现,当在特定位置放入一个看似无辜的print语句(std :: cout<<&##; foo \ n";)时,程序行为会以意想不到的方式发生变化。 objdump输出还显示生成的代码中的大的更改,具体取决于该print语句的存在。

目前我们最好的猜测是这与未定义的行为和编译器优化有关(如post by John Regehr中所述)。我们的观察结果支持这种假设,即print语句的效果受优化级别的影响。 由于应用程序在单线程中运行并发应该不是问题。

为了调试未定义的行为,我们使用了clang with flags -fsanitize=undefined,unsigned-interger-overflow,address,integer并解决了所有指出的问题。我们还解决了clang static analyzer指出的所有问题,但问题仍然存在(奇怪的是gcc,clang和msvc,但结果略有不同)。

现在我们对如何最好地继续我们的调试工作缺乏想法。由于打印声明效果的非本地化,我们甚至不知道从哪里开始进行代码审查。

问题1:您建议使用哪些工具对潜在问题点进行静态和运行时分析(类似于上述的clang工具)?

问题2:除了未定义行为+编译器优化的组合之外,哪些机制可能是观察到的效果的候选者(非功能性语句改变程序行为)?

0 个答案:

没有答案