Search code examples
c++windowsvisual-studiodebuggingipc

debugging a process spawned with CreateProcess in Visual Studio


I've created a Windows/C++/WTL application that spawns a child process. The two processes communicate via anonymous pipes.

I'd like to be able to debug the child process.

Since both parent and child projects are in the same solution in Visual Studio 2008, is there any way to tell VS2008 that I'd like the debugger to debug both processes?

When I start the debugger with the parent process, the debugger won't break on any breakpoints in the child process code.

And since the child process is spawned by the parent process, I can't think of an easy way of attaching the child process (maybe via another instance of VS2008) when it's spawned.

Any insights greatly appreciated!


Solution

  • You could put a global named mutex around your CreateProcess call, and then try to grab the mutex in the child process. If you then put a breakpoint on the CreateProcess call, you should have time to attach to the child before it does anything substantial.

    Note that you would miss anything that happens before main in the child process.

    edit: As an example, something like this, untested:

    // parent.cpp
    HANDLE hMutex = ::CreateMutex(NULL, TRUE, "Global\\some_guid");
    ::CreateProcess(...);
    ::ReleaseMutex(hMutex); // breakpoint here
    ::CloseHandle(hMutex);
    
    // child.cpp
    int main(...)
    {
      HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Global\\some_guid");
      ::WaitForSingleObject( hMutex, INFINITE );
      ::CloseHandle(hMutex);
    
      ...
    }
    

    You would probably want to wrap it with #if _DEBUG or environment variable checks.