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

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

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


当前回答

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

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

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

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

其他回答

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

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

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

以下是我所做的:

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

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

在VS 2019中:

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

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

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

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

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

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

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

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