What is the equivalent of System.Diagnostics.Debugger.Launch() in unmanaged code?

前端 未结 3 986
被撕碎了的回忆
被撕碎了的回忆 2021-02-01 23:34

I need to launch a debugger from my native C++ program when certain conditions are met. In C# I just call System.Diagnostics.Debugger.Launch(). I thought that Win32 DebugBreak()

3条回答
  •  轮回少年
    2021-02-02 00:03

    I turns out that it is possible to call vsjitdebugger.exe directly with the PID of the current process. Make sure that "Native" is selected in Tools->Options->Debugging->Just-in-Time in Visual Studio.

    Here's C++ code to launch debugger. It uses UNICODE versions of various Win32 APIs. I get System directory, because CreateProcess() does not use PATH.

    bool launchDebugger()
    {
        // Get System directory, typically c:\windows\system32
        std::wstring systemDir(MAX_PATH+1, '\0');
        UINT nChars = GetSystemDirectoryW(&systemDir[0], systemDir.length());
        if (nChars == 0) return false; // failed to get system directory
        systemDir.resize(nChars);
    
        // Get process ID and create the command line
        DWORD pid = GetCurrentProcessId();
        std::wostringstream s;
        s << systemDir << L"\\vsjitdebugger.exe -p " << pid;
        std::wstring cmdLine = s.str();
    
        // Start debugger process
        STARTUPINFOW si;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
    
        PROCESS_INFORMATION pi;
        ZeroMemory(&pi, sizeof(pi));
    
        if (!CreateProcessW(NULL, &cmdLine[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return false;
    
        // Close debugger process handles to eliminate resource leak
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    
        // Wait for the debugger to attach
        while (!IsDebuggerPresent()) Sleep(100);
    
        // Stop execution so the debugger can take over
        DebugBreak();
        return true;
    }
    

提交回复
热议问题