我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案例是一个重载的ASP。网应用程序,一旦我附加到w3wp.exe,许多线程将击中断点。我需要一些类似ThreadLocal<break-point>的东西。
w3wp.exe
ThreadLocal<break-point>
这可能吗?如果有,怎么做?
我建议在活动服务器上添加应用程序的另一个实例,或者在相同的硬件上,或者在新的机器上(集群它),然后只调试该实例。我不会在用户触发的代码中添加断点。如果这不是一个选择,我将添加更多的跟踪。
然而,如果这是绝对必要的,并且您需要一个解决方案统计,我相信您可以添加一个断点,它只在请求来自您的IP地址时中断。你可以通过添加一个检查HttpContext.Request.UserHostAddress的条件断点来做到这一点。但是请注意,这会大大降低应用程序的速度。
HttpContext.Request.UserHostAddress
以下是我所做的:
设置条件断点I 知道只能说到点子上
一旦断点到达并且你在你想要的线程中,在Visual Studio线程窗口(调试时,调试-> Windows ->线程),Ctrl + A(选择所有线程),然后Ctrl +单击你当前所在的线程。除了要调试的线程之外,您应该选中所有线程。
现在,Visual Studio只会逐步通过解冻的线程。这样做时,它似乎要慢得多,大概是因为它必须循环遍历所有冻结的线程,但它为我的多线程调试带来了一些理智。
如果您不想停止所有其他线程(也许您正在将Visual Studio调试器附加到需要响应请求的运行应用程序上),您可以使用一个宏来自动创建和删除断点。
这是在在Visual Studio中调试多线程程序时,对堆栈溢出问题“跨步”的回答中建议的。
但是,该链接只解释了如何逐行调试。我建议您修改宏(如果您对它感到舒服的话),使它修改所有的断点(例如在给定的行范围内),只在当前线程上停止。
演讲 这个Visual Studio扩展增加了两个快捷方式和工具栏按钮,允许开发人员在调试多线程应用程序时轻松地专注于单个线程。 它极大地减少了手动进入Threads窗口冻结/解冻所有线程的需要,但需要遵循的线程除外,因此有助于提高工作效率。 特性 仅限制当前线程的进一步执行。将冻结所有其他线程。快捷键:CTRL+T+T或雪花键。 切换到下一个单线程(基于ID)。将改变当前线程并冻结所有其他线程。快捷键:CTRL+T+J或“下一步”键
演讲
这个Visual Studio扩展增加了两个快捷方式和工具栏按钮,允许开发人员在调试多线程应用程序时轻松地专注于单个线程。
它极大地减少了手动进入Threads窗口冻结/解冻所有线程的需要,但需要遵循的线程除外,因此有助于提高工作效率。
特性
仅限制当前线程的进一步执行。将冻结所有其他线程。快捷键:CTRL+T+T或雪花键。 切换到下一个单线程(基于ID)。将改变当前线程并冻结所有其他线程。快捷键:CTRL+T+J或“下一步”键
看看在画廊这里,在官方页面或Github库上。
冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。
最正确和实用的方法是:
在Visual Studio 2015和更新版本中,过程类似:
因此,所有线程都被执行,但调试器只对当前线程进行操作。
我使用的略不同的方法:
这假设您有时间在第二个线程到达断点之前完成上述操作。如果没有,并且其他线程在你完成上述操作之前到达了你的断点,你可以在线程窗口中右键单击它们并选择冻结。
如果一个web应用程序正在生成多个线程,@MattFaus的答案将不起作用。我所做的是这样的
我认为这在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中:
TL,博士;当它跳转到错误线程时,只需按F5。
我正在Visual Studio Pro 2022预览版中调试多线程队列处理器,我在每个正在处理的队列项将击中它的地方放置了一个断点。IDE暂停,因为它到达了断点。我按下F10 (Step Over)几次来逐步通过代码。然后另一个线程到达断点,IDE将我弹出到那个线程。我按F5(继续)。第二个线程继续处理,黄色的调试行返回到原来的线程。
,条件断点为tid == xxxxx 这样,断点将只在