我有一些项目的解决方案。不同的项目有几个突破点。我想跟踪第一个线程命中其中一个断点并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这可以通过在断点上定义条件来实现,也就是说,线程名称= ...或者线程ID = ...但是我的情况是一个负载很重的ASP.NET应用程序并且很快因为我附加到w3wp.exe
许多线程将达到突破点。我需要像ThreadLocal<break-point>
这样的东西。
有可能吗?如果是这样,怎么样?
答案 0 :(得分:312)
这就是我的所作所为:
设置I的条件断点 知道只会打到线程 我正在寻找。
一旦断点命中并且您处于所需的线程中,在Visual Studio线程窗口中(在调试,调试 - > Windows - &gt;线程时), Ctrl + < kbd> A (选择所有线程),然后 Ctrl +单击您当前所在的线程。除了要调试的线程之外,您应该拥有所有线程。
现在,Visual Studio将只通过解冻的线程。这样做似乎要慢得多,大概是因为它必须遍历所有冻结的线程,但它为我的多线程调试带来了一些理智。
答案 1 :(得分:137)
冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。
最正确和最有用的方法是:
在 Visual Studio 2015 和更新版本中,过程类似:
因此所有线程都被执行,但调试器仅在当前线程上命中。
答案 2 :(得分:14)
我刚刚发布了一个Visual Studio 2010+扩展程序,它可以完全满足您的需求。 它是免费的:)。
<强>演示强>
此Visual Studio扩展添加了两个快捷方式和工具栏按钮,使开发人员可以在调试多线程应用程序时轻松专注于单个线程。
它大大减少了手动进入“线程”窗口以冻结/解冻所有线程但需要遵循的线程的需要,因此有助于提高工作效率。
功能强>
仅限进一步执行当前线程。将冻结所有其他线程。快捷方式:CTRL + T + T或雪花按钮。 切换到下一个单线程(基于ID)。将更改当前线程并冻结所有其他线程。快捷方式:CTRL + T + J或下一步按钮。
答案 3 :(得分:9)
如果正在为Web应用程序生成多个线程,则@MattFaus回答将无法正常工作。我所做的是以下
答案 4 :(得分:8)
我使用过略微的不同方法:
这假设您有时间在第二个线程到达断点之前执行上述操作。如果没有,其他线程在您完成上述操作之前点击了断点,您可以在线程窗口中右键单击它们并选择冻结。
答案 5 :(得分:4)
在VS 2019中:
答案 6 :(得分:1)
我建议在实时服务器上添加另一个应用程序实例,在同一硬件或新机器上(集群),然后只调试该实例。我不会在用户触发的代码中添加断点。如果这不是一个选项,我会添加更多跟踪。
但是,如果这是绝对必要的并且您需要解决方案统计信息,我确定您可以添加仅在请求来自您的IP地址时断开的断点。您可以通过添加检查HttpContext.Request.UserHostAddress
的条件断点来完成此操作。但请注意,这会大大减慢您的应用程序。
答案 7 :(得分:1)
如果您不想停止所有其他线程(可能是将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