如何在 Visual Studio 中仅调试一个线程 [重复]

Posted

技术标签:

【中文标题】如何在 Visual Studio 中仅调试一个线程 [重复]【英文标题】:How to debug only one thread in Visual Studio [duplicate] 【发布时间】:2011-11-18 14:00:18 【问题描述】:

我希望能够在调试时只跟踪一个线程的执行。我使用线程池,所以调试器会不断在线程之间切换,这让调试非常不舒服。

阅读:

Visual Studio, debug one of multiple threads How to debug a single thread in Visual Studio?

我得到了一种解决方案,即条件断点(基于线程的名称)。但是,我不能说“线程 #3”总是会处理有趣的情况,所以我必须更改每次执行的条件。工作量太大。

另一个解决方案是使用冻结/解冻功能只让我感兴趣的线程运行。但是,这会使某些信息不可用,因为所有线程都已暂停。

我现在使用的是让程序运行,直到我到达一个断点,我肯定会在好线程中。然后我暂停线程池的所有其他线程并尝试恢复执行。如果程序似乎卡住了,我会暂停并解冻当前线程。

理想的解决方案是找到正确的线程,对其进行标记,然后对 Visual Studio 说:“仅在标记当前线程时才中断”。

这可能吗?

【问题讨论】:

那么线程闯入的标准是什么? 标准将是停止是线程被标记 单独测试您的代码。以单元测试为例。然后你只需要调试线程交互,那种你不想想冻结线程的调试。 这不是我想要的,我的问题不是并发问题,但我只是不想浪费时间从我感兴趣的线程切换到另一个线程。 相关“Step over” when debugging multithreaded programs in Visual Studio 【参考方案1】:

在调试时,您可以冻结线程窗口中的所有线程并仅恢复您感兴趣的线程。

【讨论】:

谢谢,但它没有回答问题:我希望应用程序正常运行,并且只在一个线程中的断点处停止【参考方案2】:

我会使用您提到的条件断点,但不是与某个固定字符串进行比较,而是与某个半全局变量(可能是您的主类上的静态属性?)进行比较。

当您确定哪个线程变得有趣时,您可以使用即时窗口设置变量名称并允许命中条件断点。

【讨论】:

这将是一个可能的解决方案。我看到了 2 个缺点:我需要修改我的代码来调试它,我需要经历一个(复杂的)断点过程(1 点击 vs 点击,复制过去,1 点击) 对于那些最近收听的人(比如我),我建议进一步阅读answer which elaborates this workaround。我还建议投票给the suggestion mentioned here。【参考方案3】:

有点晚了,但这是搜索中的第一个答案。

我在 VS 2015 中使用以下...

var thread = System.Threading.Thread.CurrentThread;
if (thread.Name == null)
            thread.Name = "Main";

然后在断点...

System.Threading.Thread.CurrentThread.Name == "Main"

为了使其更灵活,您可以将 Thread 嵌入到自定义类中。

仅供参考:您不能在条件断点中使用静态变量,因为它们不在上下文中。从来没有真正理解为什么静态并不总是在上下文中。

【讨论】:

感谢您的回答(即使迟到了)您会在哪里添加第一段代码来命名线程? (我已经提到将这个添加到代码中需要提前知道我想要关注的线程) @kamaradclimber。尽快地。一个线程名只能设置一次,否则会出现异常。您可以在调试中手动设置 thread.Name。你也可以说 if thread.name == xxx System.Diagnostics.Debugger.Break() 对不起.. 5 分钟超时。 @kamaradclimber。尽快地。一个线程名只能设置一次,否则会出现异常。您可以在调试中手动设置 thread.Name 或仅设置 System.Threading.Thread.CurrentThread.Name = "xyz"。你也可以说... if (thread.name == xxx) System.Diagnostics.Debugger.Break();。如果需要,您可以为多个线程指定相同的名称。在过去,我已经添加了 bool stop = thread.Name == "someName" 的代码,然后在调试断点中你可以只输入条件stop。让生活更轻松

以上是关于如何在 Visual Studio 中仅调试一个线程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 代码中仅搜索特定文件类型?

如何限制部署后脚本在 Visual Studio 数据库项目中仅运行一次

如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?

.NET Web应用配置本地IIS(实现Visual Studio离线运行与调试)

调试时如何让 Visual Studio 保持在一个线程上?

Web Essentials 浏览器链接在 Visual Studio 2015 中仅适用于 ASP.net 5 应用程序