使用调试标志运行的调试代码和使用opt标志运行的SEGFULTS 我有一个C++代码,它带有优化标志,但不是用调试标志运行它。这使我无法使用调试器。除了一连串的cout声明之外,还有其他方法/指南吗

使用调试标志运行的调试代码和使用opt标志运行的SEGFULTS 我有一个C++代码,它带有优化标志,但不是用调试标志运行它。这使我无法使用调试器。除了一连串的cout声明之外,还有其他方法/指南吗,c++,debugging,C++,Debugging,我使用的是*nix平台,使用的是英特尔12.1编译器,我很确定这是一个内存问题,我需要用valgrind来解决。唯一让我困惑的是为什么它不在调试模式下显示 Valgrind对于基于Unix的系统来说是一个非常有用的工具,用于排除发布模式可执行文件的故障(gflags和WinDebug对于Windows非常有用。) 我还建议不要放弃调试器-您可以在调试器中运行非调试可执行文件,并且仍然可以获得有关segfault的有用信息。通常情况下,您还可以添加一些级别的调试信息,即使启用了优化,以提供更多的上

我使用的是*nix平台,使用的是英特尔12.1编译器,我很确定这是一个内存问题,我需要用valgrind来解决。唯一让我困惑的是为什么它不在调试模式下显示

Valgrind对于基于Unix的系统来说是一个非常有用的工具,用于排除发布模式可执行文件的故障(gflags和WinDebug对于Windows非常有用。)

我还建议不要放弃调试器-您可以在调试器中运行非调试可执行文件,并且仍然可以获得有关segfault的有用信息。通常情况下,您还可以添加一些级别的调试信息,即使启用了优化,以提供更多的上下文。您还可以检查“英特尔编译器”可能提供的任何调试模式堆检查功能,因为这些功能在调试版本中可能无法被检测到(由于内存管理不同)

还请注意,通常有多个级别的优化可用于“发布模式”。您可以尝试退回到一个不太激进的优化级别,看看错误是否仍然发生

您还可以查看“英特尔编译器”网站,查看是否有任何关于正在使用的编译器版本优化的错误修复/错误报告

如果没有这些帮助,您可以尝试使用替代编译器(除非您使用的是特定于英特尔的编译器),以查看问题是否与编译器相关


最后,正如klm123所指出的,注释掉块是定位问题的好方法。

代码中有警告吗?代码的作用是什么?通常,当您以某种方式依赖未定义的行为时(有时是由编译器错误引起的),就会发生这种情况。您通常可以使用调试信息和优化进行构建,因此您可以获得符号,以便调试器在代码优化时告诉您所使用的函数。您的平台和编译器是什么?即使您进行了优化,只要包含调试符号,您也应该能够大致了解错误所在的位置。除了加载内核转储,您还可以通过Valgrind或clang asan之类的内存调试器运行程序,并找到bug所在的线索。或许还可以编写更好的单元测试?您还可以1。注释掉部分代码,定位问题。二,。检查与内存管理相对应的代码部分是否存在内存问题,例如内存泄漏。但我猜你问的是不同的问题?工具?