在C# / Visual Studio中有没有一种方法可以在断点处暂停代码执行?

6
有没有办法在C# / Visual Studio中的断点处延迟当前线程的执行一段时间?等待结束后,执行应该继续。
我知道在VS中有一个“当命中”功能,允许在命中断点时执行任意代码(主要是为了将信息打印到控制台),但它非常有限;它不允许放置Thread.Sleep或任何耗时操作(如for循环)。 委托/lambda函数也不被允许。
我正在使用Visual Studio 2012。

1
我怀疑你能做到这个... 为什么不直接在你的代码中加入睡眠呢? - Thomas Ayoub
补充@Thomas - 也许可以使用这样的结构:if (System.Diagnostics.Debugger.IsAttached && maybeSomeOtherCondition) { // Sleep } - Corak
我认为断点表达式求值器使用断点处的上下文。如果您的程序有一个可从带有断点的函数访问的 sleep 函数,您可以调用它(也许如果它返回一个虚拟 int 值?)。但由于这可能需要您更改代码,因此可能不是您想要的。 - Mark Walker
Thomas,因为它需要重建整个项目,在我的特定情况下非常耗时。顺便说一句,我正在做这件事,但很烦人。 - dimnnv
@VladFeinstein,从理论上讲这是一个选项,但它会导致数十个断点。实际上,我发现许多超时设置在注册表键中,例如HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Debugger,但不幸的是,在那里没有100毫秒的超时。 - dimnnv
显示剩余3条评论
1个回答

0

我有一个本地解决方案,需要重新编译一次。如果需要,我相信它可以被翻译成C#。

定义这个结构:

struct THREAD_DATA
{
    int ms;
    DWORD id;
    THREAD_DATA(DWORD _id, int _ms) : id(_id), ms(_ms) {};
};

还有这两个函数:

DWORD WINAPI PauseThread(LPVOID p)
{
    THREAD_DATA* ptd = (THREAD_DATA*)p;
    HANDLE target = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ptd->id);
    SuspendThread(target);
    Sleep(ptd->ms);
    ResumeThread(target);
    delete p;
    return 0;
}
void PauseCurrentThread(int ms)
{
    THREAD_DATA* ptd = new THREAD_DATA(GetCurrentThreadId(), ms);
    HANDLE h = CreateThread(NULL, 0, &PauseThread, (LPVOID)ptd, 0, 0);
}

当您处于断点时,请使用即时窗口运行以下代码:PauseCurrentThread(5000) 或者您需要的毫秒延迟时间。
如果您想在多个项目中执行此操作而不进行仪器化 - 我可能可以开发一个Visual Studio扩展程序来自动完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接