我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案子是个沉重的ASPNET应用程序,一旦我附加到w3wp.exe许多线程将击中断点。我需要一些东西,比如ThreadLocal<断点>。
这可能吗?如果有,怎么做?
我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案子是个沉重的ASPNET应用程序,一旦我附加到w3wp.exe许多线程将击中断点。我需要一些东西,比如ThreadLocal<断点>。
这可能吗?如果有,怎么做?
当前回答
冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。
最正确和实用的方法是:
在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“Filter…”。 输入“ThreadId=(当前线程id)”。
在Visual Studio 2015及更新版本中,过程类似:
在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“设置…”。 勾选“条件”并在下拉菜单中选择“过滤” 输入“ThreadId=(当前线程id)”。
因此,所有线程都被执行,但调试器只对当前线程进行操作。
其他回答
我使用的一种略有不同的方法:
创建一个普通的断点并让它被命中 在线程窗口中查找当前正在调试的托管线程ID 在断点窗口和选择器筛选器中右键单击断点 输入ThreadId=xxx,其中xxx是2中的线程ID 现在,您可以在不停止其他线程的情况下进行调试,而不需要它们触及您的断点
这假设您有时间在第二个线程到达断点之前完成上述操作。如果没有,并且其他线程在你完成上述操作之前到达了你的断点,你可以在线程窗口中右键单击它们并选择冻结。
我刚刚发布了一个Visual Studio 2010+扩展,它完全可以满足你的需求。 而且它是免费的:)。
Presentation This Visual Studio extension adds two shortcuts and toolbar buttons to allow developers to easily focus on single threads while debugging multi-threaded applications. It dramatically reduces the need to manually go into the Threads window to freeze/thaw all threads but the one that needs to be followed, and therefore helps improve productivity. Features Restrict further execution to the current thread only. Will freeze all other threads. Shortcut: CTRL+T+T or Snowflake button. Switch to the next single thread (based on ID). Will change current thread and freeze all other threads. Shortcut: CTRL+T+J or Next button.
在这里的画廊,在官方页面或Github仓库检查它。
在VS 2019中:
在某处设置断点。 点击F5(继续)直到你的线程出现。 单击断点以删除它。 您可以使用F10或F11进行线程步进。
如果您不想停止所有其他线程(也许您正在将Visual Studio调试器附加到需要响应请求的运行应用程序上),您可以使用一个宏来自动创建和删除断点。
这是在回答Stack Overflow问题“Step over”时在Visual Studio中调试多线程程序的建议。
但是,该链接只解释了如何逐行调试。我建议您修改宏(如果您对它感到舒服的话),使它修改所有的断点(例如在给定的行范围内),只在当前线程上停止。
TL,博士;当它跳转到错误线程时,只需按F5。
我正在Visual Studio Pro 2022预览版中调试多线程队列处理器,我在每个正在处理的队列项将击中它的地方放置了一个断点。IDE暂停,因为它到达了断点。我按下F10 (Step Over)几次来逐步通过代码。然后另一个线程到达断点,IDE将我弹出到那个线程。我按F5(继续)。第二个线程继续处理,黄色的调试行返回到原来的线程。