我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案子是个沉重的ASPNET应用程序,一旦我附加到w3wp.exe许多线程将击中断点。我需要一些东西,比如ThreadLocal<断点>。
这可能吗?如果有,怎么做?
我有一些项目的解决方案。在不同的项目中有几个断点。我希望跟踪第一个到达这些断点之一的线程,并继续跟踪该单个线程,尽管其他线程进入相同的代码块。
我知道这是可能的,通过在断点上定义一个条件,即线程名称=…或者线程Id =…但我的案子是个沉重的ASPNET应用程序,一旦我附加到w3wp.exe许多线程将击中断点。我需要一些东西,比如ThreadLocal<断点>。
这可能吗?如果有,怎么做?
当前回答
通过右击该行的侧栏来设置断点条件。选择“条件”,输入以下内容,并将线程名称加引号:
System.Threading.Thread.CurrentThread.Name = =“name_of_your_thread”
或者你也可以从“Threads”窗口中获取线程的“Managed ID”,然后使用:
System.Threading.Thread.CurrentThread.ManagedThreadId = = your_managed_thread_id
其他回答
冻结/解冻线程是一种不正确的方式,因为其他线程不执行任何代码。
最正确和实用的方法是:
在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“Filter…”。 输入“ThreadId=(当前线程id)”。
在Visual Studio 2015及更新版本中,过程类似:
在断点窗口中按Ctrl+A(选择所有断点)。 右键单击并选择“设置…”。 勾选“条件”并在下拉菜单中选择“过滤” 输入“ThreadId=(当前线程id)”。
因此,所有线程都被执行,但调试器只对当前线程进行操作。
通过右击该行的侧栏来设置断点条件。选择“条件”,输入以下内容,并将线程名称加引号:
System.Threading.Thread.CurrentThread.Name = =“name_of_your_thread”
或者你也可以从“Threads”窗口中获取线程的“Managed ID”,然后使用:
System.Threading.Thread.CurrentThread.ManagedThreadId = = your_managed_thread_id
如果一个web应用程序正在生成多个线程,@MattFaus的答案将不起作用。我所做的是这样的
设置断点来中断我想要的函数中的线程。 一旦线程到达断点并被暂停,我删除断点并继续使用F8、F10和F11进行调试,以便其他线程可以运行。
我刚刚发布了一个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仓库检查它。
在VS2019中,条件断点为tid == xxxxx 这样,断点将只在该线程上被命中