如何在Visual Studio中debugging单个线程?
我有一些项目的解决scheme。 在不同的项目中有几个突破点。 我想跟踪第一个线程碰到这些断点之一,并继续跟踪那个单线程,尽pipe其他线程进入相同的代码块。
我知道这是可能的通过定义一个条件的断点,即线程名称= …或线程Id = …但我的情况是一个沉重的ASP.NET应用程序,只要我附加到w3wp.exe
很multithreading都会打到断点。 我需要一些像ThreadLocal<break-point>
。
可能吗? 如果是这样,怎么样?
冻结/解冻线程是不正确的方式,因为其他线程不执行任何代码。
最正确和可用的方法是:
- 在断点窗口中按Ctrl + A(select所有断点)。
- 右键单击并select“筛选…”。
- input“ThreadId =(当前线程ID)”。
在Visual Studio 2015及更新版本中,过程类似:
- 在断点窗口中按Ctrl + A(select所有断点)。
- 右键单击并select“设置…”。
- 选中“条件”并在下拉菜单中select“filter”
- input“ThreadId =(当前线程ID)”。
所以所有的线程都被执行,但debugging器仅仅在当前线程上。
以下是我所做的:
-
设置一个有条件的断点,我知道只会在我正在寻找的线程上点击。
-
一旦断点击中,你在你想要的线程中,在Visual Studio线程窗口(debugging时,debugging – > Windows – >线程), Ctrl + A (select所有线程),然后按住Ctrl键并单击线程目前在。 除了要debugging的选项之外,您应该拥有所有线程。
- 右键单击,然后select“冻结”。
现在,Visual Studio将只遍历解冻后的线程。 这样做似乎要慢得多,大概是因为它必须循环所有的冻结线程,但它给我的multithreadingdebugging带来了一些理智。
我刚刚发布了一个Visual Studio 2010+扩展,完全符合您的要求。 它是免费的:)。
介绍
这个Visual Studio扩展添加了两个快捷方式和工具栏button,以便开发人员可以在debuggingmultithreading应用程序时轻松关注单线程。
它大大降低了手动进入线程窗口以冻结/解冻所有线程(但需要遵循的线程)的需求,因此有助于提高生产力。
特征
仅限于进一步执行到当前线程。 将冻结所有其他线程。 快捷键:CTRL + T + T或雪花button。 切换到下一个单线程(基于ID)。 将改变当前线程并冻结所有其他线程。 快捷键:CTRL + T + J或下一步button。
在Gallery上, 官方页面或Github存储库中 查看 。
我用了一个稍微不同的方法:
- 创build一个正常的断点,让它被击中
- 在您的线程窗口中查找您当前正在debugging的托pipe线程标识
- 在断点窗口和selectfilter中右键单击断点
- inputThreadId = xxx其中xxx是来自2的线程ID
- 你现在可以在不停止其他线程的情况下进行debugging,而且不用停止你的断点
这假定你有时间在第二个线程到达你的断点之前做上述事情。 如果没有,并且其他线程在完成上述操作之前触发了断点,则可以在线程窗口中右键单击它们并select冻结。
如果正在为Web应用程序生成多个线程,@MattFaus答案将不起作用。 我所做的是以下
- 设置一个断点来中断我想要的函数中的线程。
- 一旦线程到达断点并暂停,我将删除断点并使用F8,F10和F11继续debugging,以便其他线程可以运行。
我build议在实时服务器上添加另一个应用程序实例,或者在同一个硬件上,或者在一台新的机器上(集群),然后只debugging那个实例。 我不会在用户触发的代码中添加断点。 如果这不是一个选项,我会添加更多的跟踪。
但是,如果这是绝对必要的,并且您需要一个解决scheme统计信息,我相信您可以添加一个断点,只有当请求来自您的IP地址时才会中断。 你可以通过添加一个检查HttpContext.Request.UserHostAddress
的条件断点来做到这一点。 但请注意,这大大减慢了您的应用程序。
如果您不想停止所有其他线程(可能是将Visual Studiodebugging器附加到需要应答请求的正在运行的应用程序),则可以使用自动创build和删除断点的macros。
当在Visual Studio中debuggingmultithreading程序时,在 Stack Overflow问题“Step over”的答案中提出了这个问题 。
但是,链接只解释如何逐行debugging。 我build议你修改macros(如果你愿意的话),使它修改所有断点(例如在一个给定的行范围内),只在当前线程上停止。
我认为这在Visual Studio 2015中略有不同。他们已经在断点中改变了一些东西,但是这里是如何应用来自hzdbyte(上面)的接受的答案:
在编码边界的断点处,右键单击>条件>从“条件expression式”更改为“filter”。 这可以让你通过ThreadId进行过滤。
或者在断点窗口中的断点上,右键单击>设置>勾选条件框并执行上述操作。