代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

VisualC++:在释放模式下启动/不调试的差异

  •  15
  • Ashwin Nanjappa  · 技术社区  · 14 年前

    两者有什么区别 开始调试( 不调试启动( CTRL键 F5级 ) 当代码在

    我看到了 CTRL键 - 比…快10倍 F5级 对于一些C++代码。如果我没有错,调试器将附加到 CTRL键

    (假设释放和调试模式是创建新VisualC++项目时所得到的典型配置。)

    4 回复  |  直到 11 年前
        1
  •  18
  •   JBH    14 年前

    问题是,如果Windows检测到您的程序正在调试器下运行,它会丢弃一个特殊的调试堆。这似乎发生在操作系统级别,与编译的任何调试/发布模式设置无关。

    同样的问题已经让我发疯一段时间了;今天我发现了以下内容,这篇文章就是从这里衍生出来的: http://blogs.msdn.com/b/larryosterman/archive/2008/09/03/anatomy-of-a-heisenbug.aspx

        2
  •  8
  •   Will Dean    14 年前

    “启动而不调试”只是告诉Windows按正常运行的方式启动应用程序。

    “从调试开始”启动VS调试器,并让它在调试器中运行应用程序。

    这与debug/release构建设置没有多大关系。

    • 发出的代码不会得到优化,因此更容易调试,因为它与源代码更接近
    • 编译器&链接器将输出一个包含大量额外信息的.PDB文件来帮助调试器-这些信息的存在或不存在对代码的性能没有影响,只是对调试的容易程度没有影响。
    • 像ASSERT和VERIFY这样的条件宏在发布版本中不会有操作,但在调试版本中是活动的。

    每个项目都是独立的和可选的!

    • VS调试器在启动时效率非常低,部分原因是VS中的所有内容都是VS2010之前的慢启动版本,当IDE进入调试模式时,屏幕上的每个像素都将被重新绘制大约30次,并且闪烁很多。
    • 根据配置方式的不同,调试器可能会在启动时花费大量时间来尝试加载作为进程一部分的许许多多操作系统组件的符号(即PDB文件)-它可能会尝试通过web获取这些文件,在某些情况下这可能需要一段时间。
    • 应用程序通常执行的许多活动(加载dll、启动线程、处理异常)都会导致调试器收到警报。这既可以减缓它们的速度,也可以使它们倾向于按顺序运行。
        3
  •  4
  •   sharptooth    14 年前

    IsDebuggerPresent() OutputDebugString() 根据是否附加了调试器,行为会有所不同。

    IsDebuggerPresent() 只返回另一个值,这样您的程序就可以对该值作出反应,并有目的地执行不同的操作。 当没有附加调试器时,返回速度要快得多,因此如果多次调用它,您将看到程序在没有调试器的情况下运行得要快得多。

        4
  •  0
  •   Simon    14 年前