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

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

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


当前回答

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

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

其他回答

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

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

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

以下是我所做的:

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

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

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

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

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

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

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