Freigeben über


F5 vs. Ctrl-F5

In VS, F5 will launch your application under the debugger. Under the
debugger, you'll hit breakpoints, be able to edit-and-continue, and do all the
debugger things you know and love.

Ctrl+F5 will launch your application outside of the debugger. This is like
launching your app from the "start | run" menu, except VS becomes the parent
process instead of explorer. Ctrl+F5 is purely convenience functionality.

Ideally ,
running under a debugger shouldn't change the app's behavior. An app may do
something evil, like

detect if a debugger is attached to itself, and use that to do different
behavior.

Under the covers, they both translate to calls to CreateProcess. The
questions are:

1) what version of CreateProcess do you call?

kernel32!CreateProcess is the OS API to create a process. ICorDebug::CreateProcess
has the same signature as kernel32's, but the ICorDebug version will launch the
program as a managed debuggee.

2) what flags do you pass? CreateProcess takes a set of

flags. If you pass (DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS) to the flags,
then the child process will be a native.

If you enable both managed + native debugging, then you've enabled
interop-debugging.

Here's a matrix:

  F5 (under debugger) Ctrl+F5 (outside debugger)
Managed-only ICorDebug::CreateProcess, 0 flags kernel32!CreateProcess, 0 flags
Native-only kernel32!kernel32!CreateProcess,  DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS kernel32!CreateProcess, 0 flags
Interop (aka Mixed-mode) ICorDebug::CreateProcess, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS kernel32!CreateProcess, 0 flags

Comments

  • Anonymous
    September 28, 2005
    The comment has been removed
  • Anonymous
    September 28, 2005
    I forgot to mention that.
    VS 2005 tries to front-load debugging startup time by pre-creating the debuggee and then attaching to that. The precreated-debuggee is "VsHost", and it then loads your real debuggee.
    See http://blogs.msdn.com/dtemp/archive/2004/08/17/215764.aspx for more details.
  • Anonymous
    October 16, 2005
    The mixed mode debugger does changed the app's behaviour - at least that's my experience with /clr. I've noticed very slow performance of /clr compiled code under the managed debugger in VC 05 RC. In particular, calls to standard library functions. For example write a loop to create a million random numbers with rand() (compile with /clr) and run under the managed debugger; it's about 100 times slower then running without the debugger!

    That said, /clr:pure seems to be OK in the same scenario.
  • Anonymous
    October 17, 2005
    I'm disappointed about the slowdown. I'll need to look at that closer.
    Debugging will always have some perf impact; but the numbers you point out here are signifcantly larger than ideal.
  • Anonymous
    October 17, 2005
    Mike,

    Thanks, I'm already have bug report on the VS2005 site regarding this:

    http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackId=e976ea2a-ba1e-4537-9493-46af9429a81e

    There is a simple test case posted there. I hope I'm wrong or this has been fixed in the RTM as I'm currently unable to debug a mixed mode C++ app (without a lot of pain) that I'm porting from VS 03.

    jeff anderson
    Braid Media Arts
    kilroytrout@hotmail.com