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

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

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


当前回答

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

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

其他回答

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

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

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

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

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

以下是我所做的:

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

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

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

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

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

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

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