我正在尝试调试由另一个进程产生的错误进程。我尝试过__debugbreak(); __asm int 3;
执行图像文件,但似乎没有任何效果。有谁知道如何从代码中附加调试器?
4 回答
如果没有其他工作,我有时会在生成的过程开始时使用一个技巧,我放了一个
while(1)
{
Sleep(1000); // +Breakpoint
}
启动后附加到进程并使用“设置下一个语句”来传递循环。
我一般用它来调试windows服务的OnStart()
确保在问题解决后删除此代码。
我有时使用的是
消息框(NULL,“附加”,“附加”,MB_OK)
您需要在 SDK 和#include "windows.h" 中进行链接,但仅此而已。将弹出一个消息框并等待您单击“确定”。只需在该点附加调试器,设置断点并单击确定。
只要生成进程没有时间关键的看门狗等待生成进程的回复,这就会起作用。如果有,您可能需要增加超时,以便您可以启动 VS 并附加。
Visual Studio 将 DEBUG_ONLY_THIS_PROCESS 标志与 CreateProcess 一起使用。您可以切换到 windbg,也可以在代码中附加调试器。例如,获取活动的 VisualStudio.DTE.11.0 对象,然后调用 _DTE::Debugger 来获取调试器,并调用 Debugger::LocalProcesses 来获取进程列表。找到所需的进程(例如通过文件名或创建时间)然后调用 Process::Attach。
为什么您不使用DebugBreak而不是 __debugbreak()?
这是差异的描述
我遇到过调试器似乎没有启动的情况,但实际上有一个隐藏的对话框提示我要附加的 VS 会话/版本。确保通过 Windows alt-tab 以确保这不会发生在您身上。