Windows 如何使用visual studio调试子进程?
我想调试一个由进程a启动的进程B,当我启动进程B时,我不能中断主函数。进程B启动时是否有自动中断的方法?不幸的是,visual studio没有这种方法。first and main-此调试器不能同时调试多个进程。它只能调试一个进程。如果调试进程A并启动进程B,则此调试器无法调试新进程B 通常,当我们调试进程时,一个-existWindows 如何使用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时-系统执行
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();