什么是调试优化的C/C++程序的有效方法?

veh*_*zzz 14 c c++ debugging disassembly

很多时候我使用优化代码(有时甚至涉及矢量化循环),其中包含错误等.如何调试这样的代码?我正在寻找任何类型的工具或技术.我使用以下(可能是过时的)工具,所以我想升级.

我使用以下内容:

  • 既然用ddd,就看不到代码了,我用gdb + dissambler命令查看生成的代码; 我不能真正使用它来完成程序.
  • ndisasm

谢谢

a1k*_*kmm 19

调试优化程序总是比较困难,但总有办法.一些额外的提示:

  • 进行调试构建,看看你是否在调试版本中遇到了同样的错误.如果您不需要,则无需调试优化版本.
  • 如果在支持它的平台上使用valgrind.您看到的错误可能更难理解,但提前解决问题通常会简化调试.
  • printf调试是原始的,但有时如果你有一个只出现在优化版本中的复杂问题,它是最简单的方法.
  • 如果您怀疑计时问题(特别是在多线程程序中),请滚动您自己的断言版本,如果违反条件则中止或打印,并在几个选定的位置使用它,以排除可能的问题.
  • 看看你是否可以在不使用-fomit-frame-pointers的情况下重现问题,因为这会使代码很难调试,并且启用-O2或-O3.这可能会为您提供足够的信息来查找问题的原因.
  • 隔离代码的一部分,构建测试套件,看看是否可以识别出任何失败的测试用例.调试一个函数要比整个程序容易得多.
  • 尝试使用-fno-X选项逐个关闭优化.这可能有助于您找到严格的别名问题等常见问题.
  • 打开更多编译器警告.有些事情,比如严格的别名问题,如果它们在不同的优化级别之间产生行为差异,就会产生编译器警告.

  • printf调试的缺陷是它可以掩盖优化错误,因为将数据传递到printf调用的代码可能会阻止代码执行相同的优化.(我有很多实例,其中调试代码工作和优化不会成为优化程序错误.OTOH,printf将帮助您找到优化程序错误,并且是一个线索,您需要深入到程序集,以确定您是否有一个优化器bug. (2认同)

小智 7

调试发布版本时,你可以放入__asm nops; 作为断点的占位符(int 3).这很好,因为您可以保证断点位置而不会弄乱编译器优化或编写printf/cout语句.

  • 我不知道GCC,但在MSVC中使用内联汇编块会影响优化:"在函数中包含汇编语言会影响其他一些函数范围的优化" - http://msdn.microsoft. COM/EN-US /库/ 5hd5ywk0.aspx (2认同)