gpt4 book ai didi

c++ - 在 Debug模式下工作

转载 作者:行者123 更新时间:2023-11-28 00:44:57 26 4
gpt4 key购买 nike

我是 C++ 调试技术的新手,我正试图更好地理解为调试目的添加代码。

当我使用这样的语句时:

#ifdef _DEBUG
cout << "Output that should only be used in Debugging Mode." << endl;
#endif

其中的 cout 语句似乎总是在 Debug模式下运行,我只希望该行仅在我处于 Debug模式时执行。这就是我认为这些类型的 if 语句的目的,除非我似乎误解了它的实际目的。

此外,有人可以详细说明 CONSTRUCTOR_TRACEFUNCTION_TRACE 吗?它们到底有什么用,我该如何正确使用它们?

最佳答案

#ifdef _DEBUG是一个编译时(好吧,实际上是预处理时)构造,它与您是否在调试器中执行程序无关,但与 _DEBUG 的事实无关。宏被定义。

通常你至少有两组构建选项,一组用于调试(它定义了 _DEBUG ,禁用几个编译器优化并生成调试符号)和一组用于发布(它没有定义 _DEBUG ,启用所有相关的编译器优化,可能不会生成调试信息,或在单独的文件中生成它们)。

当你开发你的程序时,你通常会使用调试配置,当构建可执行文件以最终部署/实际在日常使用中使用时,你将使用发布配置,它不包括 #ifdef _DEBUG ... #endif 中包含的代码。 block 。一旦可执行文件以其中一种配置生成,它就会保持这种状态,_DEBUG 的事实在编译时定义的在可执行文件中是“一成不变的”。

话虽这么说,特定于平台的方法来检测是否附加了调试器,但通常最好不要弄乱那些东西——根据是否可能附加了调试器来改变程序行为违背了使用调试器的初衷。


附录

Ok so let me see if I understand fully. So if I hit f5 to run the debug build, whatever is inside this #ifdef _DEBUG gets executed and when I hit ctrl+f5 to run it in release mode, it doesn't run the code inside the #ifdef _DEBUG which it does for me. I don't think I fully understand what you are trying to say. Can you try explaining it a bit simplier if you can. I am not that advanced in c++ and the Visual Studio environment.

在我看来,对于 C++ 中构建/调试过程的进行方式存在一些误解。当您按下 F5 时,会发生以下情况:

  1. 调用编译器;它根据当前所选配置的build设置编译文件并生成可执行文件;1
  2. 可执行文件已运行;
  3. VS 调试器附加到新创建的进程2

当您按下 Ctrl+F5 时,唯一的区别是跳过了第 3 步;其余完全相同。

现在,什么时候做 _DEBUG进来玩?在步骤 1,生成可执行文件(实际上,在步骤 1 的早期,在预处理阶段);是否连接调试器没有区别——放在 #ifdef _DEBUG 中的指令 block 已经从可执行文件中写入(或排除)。

这里的重点是F5/Ctrl+F5和Debug/Release配置是两个正交的设置;您可以构建一个“调试”可执行文件并在不调试的情况下启动它,并构建一个“发布”可执行文件并在调试时启动它(实际上,通常这样做是为了调试仅在优化构建中出现的问题)。调试器附加到程序这一事实根本不应该改变它的行为3

同样,开始时使用/不使用调试器与您是否希望在此运行中附加调试器有关,构建调试/发布配置与实际构建可执行文件的方式相关(调试配置是更多的集合“调试友好”设置 - _DEBUG 定义为启用调试代码,assert 已启用,优化已禁用,调试符号已启用,...)。


注释

  1. 如果之前的构建有一些可重用的输出,则跳过或缩短此步骤 - 例如,如果源未更改上次构建的可执行文件并保留当前配置;
  2. 实际上,进程是在附加调试器的情况下创建的;这可能会导致一些微妙的问题,但在这里无关紧要;
  3. 实际上,在某些情况下,调试器确实会改变其行为,因为进程可以使用 IsDebuggerPresent 检查调试器。 ,但出于上述原因,通常您不想这样做。

关于c++ - 在 Debug模式下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com