我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。

我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案子是个沉重的ASPNET应用程序,一旦我附加到w3wp.exe许多线程将击中断点。我需要一些东西,比如ThreadLocal<断点>。

这可能吗?如果有,怎么做?


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

然而,如果这是绝对必要的,并且您需要一个解决方案统计,我相信您可以添加一个断点,它只在请求来自您的IP地址时中断。您可以通过添加一个检查HttpContext.Request.UserHostAddress的条件断点来做到这一点。但是请注意,这会大大降低应用程序的速度。


以下是我所做的:

设置一个条件断点 知道只能说到点子上 我一直在寻找的 一旦到达断点,你就在你想要的线程中,在Visual Studio线程窗口(调试时,调试-> Windows ->线程),按Ctrl + A(选择所有线程),然后按Ctrl +单击你当前所在的线程。除了要调试的线程之外,您应该选中所有线程。 右键单击,选择“冻结”。

现在,Visual Studio只会逐步通过解冻的线程。这样做时,它似乎要慢得多,大概是因为它必须循环遍历所有冻结的线程,但它为我的多线程调试带来了一些理智。


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

这是在回答Stack Overflow问题“Step over”时在Visual Studio中调试多线程程序的建议。

但是,该链接只解释了如何逐行调试。我建议您修改宏(如果您对它感到舒服的话),使它修改所有的断点(例如在给定的行范围内),只在当前线程上停止。


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

Presentation This Visual Studio extension adds two shortcuts and toolbar buttons to allow developers to easily focus on single threads while debugging multi-threaded applications. It dramatically reduces the need to manually go into the Threads window to freeze/thaw all threads but the one that needs to be followed, and therefore helps improve productivity. Features Restrict further execution to the current thread only. Will freeze all other threads. Shortcut: CTRL+T+T or Snowflake button. Switch to the next single thread (based on ID). Will change current thread and freeze all other threads. Shortcut: CTRL+T+J or Next button.

在这里的画廊,在官方页面或Github仓库检查它。


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

最正确和实用的方法是:

在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“Filter…”。 输入“ThreadId=(当前线程id)”。

在Visual Studio 2015及更新版本中,过程类似:

在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“设置…”。 勾选“条件”并在下拉菜单中选择“过滤” 输入“ThreadId=(当前线程id)”。

因此,所有线程都被执行,但调试器只对当前线程进行操作。


我使用的一种略有不同的方法:

创建一个普通的断点并让它被命中 在线程窗口中查找当前正在调试的托管线程ID 在断点窗口和选择器筛选器中右键单击断点 输入ThreadId=xxx,其中xxx是2中的线程ID 现在,您可以在不停止其他线程的情况下进行调试,而不需要它们触及您的断点

这假设您有时间在第二个线程到达断点之前完成上述操作。如果没有,并且其他线程在你完成上述操作之前到达了你的断点,你可以在线程窗口中右键单击它们并选择冻结。


如果一个web应用程序正在生成多个线程,@MattFaus的答案将不起作用。我所做的是这样的

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


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

在编码边距的断点上,右键单击>条件>从“条件表达式”更改为“筛选器”。这允许你通过ThreadId进行过滤。

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


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

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

或者你也可以从“Threads”窗口中获取线程的“Managed ID”,然后使用:

System.Threading.Thread.CurrentThread.ManagedThreadId = = your_managed_thread_id


在VS 2019中:

在某处设置断点。 点击F5(继续)直到你的线程出现。 单击断点以删除它。 您可以使用F10或F11进行线程步进。


TL,博士;当它跳转到错误线程时,只需按F5。

我正在Visual Studio Pro 2022预览版中调试多线程队列处理器,我在每个正在处理的队列项将击中它的地方放置了一个断点。IDE暂停,因为它到达了断点。我按下F10 (Step Over)几次来逐步通过代码。然后另一个线程到达断点,IDE将我弹出到那个线程。我按F5(继续)。第二个线程继续处理,黄色的调试行返回到原来的线程。


在VS2019中,条件断点为tid == xxxxx 这样,断点将只在该线程上被命中