Windows 如何使用visual studio调试子进程?

Windows 如何使用visual studio调试子进程?,windows,visual-studio,debugging,visual-c++,Windows,Visual Studio,Debugging,Visual C++,我想调试一个由进程a启动的进程B,当我启动进程B时,我不能中断主函数。进程B启动时是否有自动中断的方法?不幸的是,visual studio没有这种方法。first and main-此调试器不能同时调试多个进程。它只能调试一个进程。如果调试进程A并启动进程B,则此调试器无法调试新进程B 通常,当我们调试进程时,一个-existDebugPort对象附加到进程。(EPROCESS.DebugPort)也在EPROCESS对象中存在NoDebugInherit标志。当进程A启动新进程B时-系统执行

我想调试一个由进程a启动的进程B,当我启动进程B时,我不能中断主函数。进程B启动时是否有自动中断的方法?

不幸的是,visual studio没有这种方法。first and main-此调试器不能同时调试多个进程。它只能调试一个进程。如果调试进程A并启动进程B,则此调试器无法调试新进程B

通常,当我们调试进程时,一个-exist
DebugPort
对象附加到进程。(
EPROCESS.DebugPort
)也在
EPROCESS
对象中存在
NoDebugInherit
标志。当进程A启动新进程B时-系统执行下一步(伪代码):

如果未设置调试器下的A和
NoDebugInherit
标志-新进程B也附加到相同的
DebugPort
(相同的调试器)

如何设置
NoDebugInherit

如果我们通过
CreateProcess
api启动流程-如果我们将
NoDebugInherit
设置为true。如果我们使用而不使用-
NoDebugInherit
设置为false,那么新进程创建的所有子进程也将被调试

如果我们通过
DebugActiveProcess
NoDebugInherit
连接到已经运行的进程,则设置为true。因此,如果此进程启动新进程,则不会对其进行调试

我们可以通过
NtQueryInformationProcess
NtSetInformationProcess
使用
ProcessDebugFlags
PROCESSINFOCLASS
(它在ntddk.h中声明)来查询和设置这个
nodebughinherit
。有了它,我们可以随时通过下一个代码查询和更改
ProcessDebugFlags

// from WRK\WRK-v1.2\public\sdk\inc\ntpsapi.h  

//
// Define process debug flags
//
#define PROCESS_DEBUG_INHERIT 0x00000001

NTSTATUS SetDebugInherit(HANDLE hProcess, BOOLEAN bInherit)
{
    ULONG DebugFlags;

    // hProcess must have PROCESS_QUERY_INFORMATION access
    NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessDebugFlags, &DebugFlags, sizeof(DebugFlags), 0);

    if (0 <= status)
    {
        bInherit ? DebugFlags |= PROCESS_DEBUG_INHERIT : DebugFlags &= ~PROCESS_DEBUG_INHERIT;

        // hProcess must have PROCESS_SET_INFORMATION access
        status = NtSetInformationProcess(hProcess, ProcessDebugFlags, &DebugFlags, sizeof(DebugFlags));
    }

    return status;
}
或者,如果您可以显示gui:

WCHAR sz[64];
swprintf(sz, L"attact to %u(0x%x)\n", GetCurrentProcessId(), GetCurrentProcessId());
while (!IsDebuggerPresent()) MessageBoxW(0,0,sz, MB_ICONINFORMATION);
__debugbreak();

当您手动附加到进程B时,它一定已经运行了一段时间


使用插件“”,VS可以在子进程启动时自动附加到子进程,并且您可以在
main()

中的第一句话处中断。非常感谢。我使用messagebox方法^_^
while (!IsDebuggerPresent()) Sleep(1000);
__debugbreak();
WCHAR sz[64];
swprintf(sz, L"attact to %u(0x%x)\n", GetCurrentProcessId(), GetCurrentProcessId());
while (!IsDebuggerPresent()) MessageBoxW(0,0,sz, MB_ICONINFORMATION);
__debugbreak();