如何在Visual Studio中调试单个线程?

时间:2011-03-14 21:26:04

标签: c# asp.net multithreading visual-studio-2010 breakpoints

我有一些项目的解决方案。不同的项目有几个突破点。我想跟踪第一个线程命中其中一个断点并继续跟踪该单个线程,尽管其他线程进入相同的代码块。

我知道这可以通过在断点上定义条件来实现,也就是说,线程名称= ...或者线程ID = ...但是我的情况是一个负载很重的ASP.NET应用程序并且很快因为我附加到w3wp.exe许多线程将达到突破点。我需要像ThreadLocal<break-point>这样的东西。

有可能吗?如果是这样,怎么样?

10 个答案:

答案 0 :(得分:312)

这就是我的所作所为:

  1. 设置I的条件断点     知道只会​​打到线程     我正在寻找。

  2. 一旦断点命中并且您处于所需的线程中,在Visual Studio线程窗口中(在调试,调试 - > Windows - &gt;线程时), Ctrl + < kbd> A (选择所有线程),然后 Ctrl +单击您当前所在的线程。除了要调试的线程之外,您应该拥有所有线程。

  3. 右键单击,然后选择“冻结”。
  4. 现在,Visual Studio将只通过解冻的线程。这样做似乎要慢得多,大概是因为它必须遍历所有冻结的线程,但它为我的多线程调试带来了一些理智。

答案 1 :(得分:137)

冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。

最正确和最有用的方法是:

  1. 在断点窗口中按Ctrl + A(选择所有断点)。
  2. 右键单击并选择&#34;过滤...&#34;。
  3. 输入&#34; ThreadId =(当前线程ID)&#34;。
  4. Visual Studio 2015 和更新版本中,过程类似:

    1. 在断点窗口中按Ctrl + A(选择所有断点)。
    2. 右键单击并选择&#34;设置...&#34;。
    3. 检查&#34;条件&#34;并选择&#34;过滤&#34;在下拉列表中
    4. 输入&#34; ThreadId =(当前线程ID)&#34;。
    5. 因此所有线程都被执行,但调试器仅在当前线程上命中。

答案 2 :(得分:14)

我刚刚发布了一个Visual Studio 2010+扩展程序,它可以完全满足您的需求。 它是免费的:)。

  

<强>演示

     

此Visual Studio扩展添加了两个快捷方式和工具栏按钮,使开发人员可以在调试多线程应用程序时轻松专注于单个线程。

     

它大大减少了手动进入“线程”窗口以冻结/解冻所有线程但需要遵循的线程的需要,因此有助于提高工作效率。

     

功能

     

仅限进一步执行当前线程。将冻结所有其他线程。快捷方式:CTRL + T + T或雪花按钮。   切换到下一个单线程(基于ID)。将更改当前线程并冻结所有其他线程。快捷方式:CTRL + T + J或下一步按钮。

here on the Galleryofficial page上查看Github repository

答案 3 :(得分:9)

如果正在为Web应用程序生成多个线程,则@MattFaus回答将无法正常工作。我所做的是以下

  • 设置断点以中断我想要的函数中的线程。
  • 一旦线程到达断点并暂停,我将删除断点并继续使用F8,F10和F11进行调试,以便其他线程可以运行。

答案 4 :(得分:8)

我使用过略微的不同方法:

  1. 创建一个正常的断点并让它被击中
  2. 在您的主题窗口中查找您当前正在调试的托管主题ID
  3. 在断点窗口和选择过滤器中右键单击断点
  4. 输入ThreadId = xxx,其中xxx是2
  5. 中的线程ID
  6. 您现在可以在不停止其他线程的情况下进行调试,并且不会让它们遇到您的断点
  7. 这假设您有时间在第二个线程到达断点之前执行上述操作。如果没有,其他线程在您完成上述操作之前点击了断点,您可以在线程窗口中右键单击它们并选择冻结。

答案 5 :(得分:4)

在VS 2019中:

  1. 在某处设置断点。
  2. 按F5键(继续)直到线程出现。
  3. 单击断点将其删除。
  4. 您可以使用F10或F11步进线程。

答案 6 :(得分:1)

我建议在实时服务器上添加另一个应用程序实例,在同一硬件或新机器上(集群),然后只调试该实例。我不会在用户触发的代码中添加断点。如果这不是一个选项,我会添加更多跟踪。

但是,如果这是绝对必要的并且您需要解决方案统计信息,我确定您可以添加仅在请求来自您的IP地址时断开的断点。您可以通过添加检查HttpContext.Request.UserHostAddress的条件断点来完成此操作。但请注意,这会大大减慢您的应用程序。

答案 7 :(得分:1)

如果您不想停止所有其他线程(可能是将Visual Studio调试器附加到需要回答请求的正在运行的应用程序),则可以使用自动创建和删除断点的宏。

an answer to Stack Overflow question "Step over" when debugging multithreaded programs in Visual Studio中建议这样做。

但是,链接只解释了如何逐行调试。我建议你修改宏(如果你觉得它很舒服),让它修改所有断点(例如在给定的行范围内),只在当前线程上停止。

答案 8 :(得分:1)

我认为这在Visual Studio 2015中略有不同。他们在断点中改变了一些内容,但是这里是如何应用hzdbyte(上面)中接受的答案:

在编码边界的断点处,右键单击&gt;条件&gt;从“条件表达式”更改为“过滤器”。然后,这允许您按ThreadId进行过滤。

或者在“断点”窗口中的断点上,右键单击&gt;设置&gt;勾选条件框并执行上述操作。

答案 9 :(得分:1)

通过右键单击该行的侧栏来设置断点条件。选择“条件”,然后输入以下内容,并在引号中加上您的线程名称:

System.Threading.Thread.CurrentThread.Name ==“ name_of_your_thread”

或者,您也可以通过从“线程”窗口获取线程的“托管ID”并使用以下方法来执行相同的操作:

System.Threading.Thread.CurrentThread.ManagedThreadId ==您的托管线程ID