如何调试一个单一的线程在Visual Studio?

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

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

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

114247 次浏览

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

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

以下是我所做的:

  1. 设置条件断点I 知道只能说到点子上

  2. 一旦断点到达并且你在你想要的线程中,在Visual Studio线程窗口(调试时,调试-> Windows ->线程),Ctrl + A(选择所有线程),然后Ctrl +单击你当前所在的线程。除了要调试的线程之外,您应该选中所有线程。

  3. 右键单击,选择“冻结”。

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

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

这是在在Visual Studio中调试多线程程序时,对堆栈溢出问题“跨步”的回答中建议的。

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

我刚刚发布了一个Visual Studio 2010+扩展,它确实是你正在寻找的。 而且它是免费的:).

演讲

这个Visual Studio扩展增加了两个快捷方式和工具栏按钮,允许开发人员在调试多线程应用程序时轻松地专注于单个线程。

它极大地减少了手动进入Threads窗口冻结/解冻所有线程的需要,但需要遵循的线程除外,因此有助于提高工作效率。

特性

仅限制当前线程的进一步执行。将冻结所有其他线程。快捷键:CTRL+T+T或雪花键。 切换到下一个单线程(基于ID)。将改变当前线程并冻结所有其他线程。快捷键:CTRL+T+J或“下一步”键

看看在画廊这里,在官方页面Github库上。

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

最正确和实用的方法是:

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

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

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

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

我使用的不同的方法:

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

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

如果一个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中:

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

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

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

在VS2019中

,条件断点为tid == xxxxx 这样,断点将只在

线程上被命中