有啥方法可以在 C#/Visual Studio 的断点上睡觉?

Posted

技术标签:

【中文标题】有啥方法可以在 C#/Visual Studio 的断点上睡觉?【英文标题】:Any way to sleep on a breakpoint in C# / Visual Studio?有什么方法可以在 C#/Visual Studio 的断点上睡觉? 【发布时间】:2015-11-20 05:48:30 【问题描述】:

在 C#/Visual Studio 中遇到断点时,有什么方法可以将当前线程的执行延迟指定的时间段? 休眠后,应继续执行。

我知道 VS 中有一个“当命中”功能,它允许在遇到断点时执行任意代码(主要是将信息打印到控制台),但它非常有限;它不允许将Thread.Sleep 或任何耗时的操作(如for 循环)放在那里。也不允许使用委托/lambda 函数。

我正在使用 Visual Studio 2012。

【问题讨论】:

我怀疑你能做到这一点......你为什么不直接把 sleep 放在你的代码中? 添加到@Thomas - 可能使用如下构造:if (System.Diagnostics.Debugger.IsAttached && maybeSomeOtherCondition) // Sleep 我认为断点表达式求值器使用断点处的上下文。如果您的程序有一个执行睡眠的函数,该函数可以通过您的断点从该函数访问,您可以调用它(也许它返回一个虚拟 int 值?)但是由于这可能需要您更改代码,它可能不是什么你在追求。 Thomas,因为它需要重建整个项目,而且在我的特殊情况下非常耗时。顺便说一句,我目前正在这样做,但它很烦人。 @Corak,它需要重建,但基本上问题是是否有可能重建。 【参考方案1】:

我有一个需要一次性重新编译的本机解决方案。如果需要,我确信它可以翻译成 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 扩展来自动执行此操作。

【讨论】:

以上是关于有啥方法可以在 C#/Visual Studio 的断点上睡觉?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以在 NVIDIA 显卡上的 Visual Studio 中运行程序调试?

有啥方法可以直接从命令行查看可用于 Visual Studio 的 Nuget 包源

Visual Studio Code - 有啥方法可以分别突出显示不同类型的错误和警告?

Visual Studio 解决方案——有啥方法可以创建一个“特殊”文件夹?

有啥方法可以从 Visual Studio 2017 中的 Catch C++ 测试中获取代码覆盖率指标?

visual studio 2010编译c的设置方法