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

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

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


当前回答

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

最正确和实用的方法是:

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

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

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

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

其他回答

我刚刚发布了一个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仓库检查它。

以下是我所做的:

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

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

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

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

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

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

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

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

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

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