1

我正在尝试调试由另一个进程产生的错误进程。我尝试过__debugbreak(); __asm int 3;执行图像文件,但似乎没有任何效果。有谁知道如何从代码中附加调试器?

4

4 回答 4

3

如果没有其他工作,我有时会在生成的过程开始时使用一个技巧,我放了一个

while(1)
{
    Sleep(1000); // +Breakpoint
}

启动后附加到进程并使用“设置下一个语句”来传递循环。

我一般用它来调试windows服务的OnStart()

确保在问题解决后删除此代码。

于 2013-07-07T08:15:17.847 回答
2

我有时使用的是

消息框(NULL,“附加”,“附加”,MB_OK)

您需要在 SDK 和#include "windows.h" 中进行链接,但仅此而已。将弹出一个消息框并等待您单击“确定”。只需在该点附加调试器,设置断点并单击确定。

只要生成进程没有时间关键的看门狗等待生成进程的回复,这就会起作用。如果有,您可能需要增加超时,以便您可以启动 VS 并附加。

于 2013-07-07T13:12:47.177 回答
2

Visual Studio 将 DEBUG_ONLY_THIS_PROCESS 标志与 CreateProcess 一起使用。您可以切换到 windbg,也可以在代码中附加调试器。例如,获取活动的 VisualStudio.DTE.11.0 对象,然后调用 _DTE::Debugger 来获取调试器,并调用 Debugger::LocalProcesses 来获取进程列表。找到所需的进程(例如通过文件名或创建时间)然后调用 Process::Attach。

于 2013-07-07T18:10:17.987 回答
0

为什么您不使用DebugBreak而不是 __debugbreak()?

这是差异的描述

我遇到过调试器似乎没有启动的情况,但实际上有一个隐藏的对话框提示我要附加的 VS 会话/版本。确保通过 Windows alt-tab 以确保这不会发生在您身上。

于 2013-07-07T07:18:37.587 回答