查找仅在优化构建中显示的C程序中的错误的最佳实践是什么

Mic*_*tor 5 c debugging gdb

我的程序使用第三部分库,在某些时候抛出分段错误.我尝试用调试符号编译库,没有编译器优化,崩溃消失了.我怀疑是编译器优化揭示了这个错误.调试此类案例的最佳做法是什么?

编辑 - (纠正上述声明:"显示"而不是"引起")

我想我被误解了.我没有打算责怪编译器,或类似的东西.我只询问了在这种情况下找到错误的最佳实践,我在第三方库中没有调试符号(崩溃回溯导致第三方库).

Arm*_*yan 8

您的怀疑是优化导致了一个错误.我怀疑您的代码具有导致未定义行为的构造,并且当优化器打开时,此未定义行为表现为错误行为或崩溃.不要责怪优化器.在你的代码中找到UB ......可能会很棘手.可能的罪魁祸首:

  • OutOfBounds索引
  • 返回地址一个temprorary
  • 其他很多东西

  • 当新程序员认为他们发现编译器中的一个错误时,它总是让我感到困惑,这个错误在他们的3`printf`语句中不断改进超过15年...... (2认同)

nos*_*nos 8

你所描述的很常见.它几乎从来都不是编译器优化中的错误.优化为您的代码做了很多事情.变量被重新排序/优化等等.如果你有一个缓冲区溢出,它可能只是溢出内存,这在调试版本中没什么大不了的,但是这个内存在优化构建中非常重要.

使用valgrind来追踪内存错误 - 它们几乎总是导致您看到症状的原因.