我有一些项目的解决方案。不同项目中有几个断点。我想跟踪第一个遇到这些断点的线程,并继续跟踪该单个线程,尽管其他线程进入了相同的代码块。
我知道可以通过在断点上定义一个条件来实现这一点,即线程名称= ...或线程ID = ...,但是我的情况是负载很重的ASP.NET应用程序,并且一旦附加到w3wp.exe
许多线程将达到断点。我需要一些东西ThreadLocal<break-point>
。
可能吗?如果是这样,怎么办?
我有一些项目的解决方案。不同项目中有几个断点。我想跟踪第一个遇到这些断点的线程,并继续跟踪该单个线程,尽管其他线程进入了相同的代码块。
我知道可以通过在断点上定义一个条件来实现这一点,即线程名称= ...或线程ID = ...,但是我的情况是负载很重的ASP.NET应用程序,并且一旦附加到w3wp.exe
许多线程将达到断点。我需要一些东西ThreadLocal<break-point>
。
可能吗?如果是这样,怎么办?
Answers:
冻结/解冻线程是错误的方法,因为其他线程不会执行任何代码。
最正确和可用的方法是:
在Visual Studio 2015及更高版本中,过程类似:
因此所有线程均被执行,但调试器仅命中当前线程。
System.Threading.Thread.CurrentThread.ManagedThreadId
吗?
这是我所做的:
设置一个条件断点,我知道该断点只会击中我要寻找的线程。
一旦断点命中,并且您位于所需的线程中,则在Visual Studio的“线程”窗口中(调试时,在Debug-> Windows-> Threads中),Ctrl+ A(选择所有线程),然后Ctrl+单击您当前所在的线程。您应该选择除要调试的线程以外的所有线程。
现在,Visual Studio将仅逐步解冻。这样做似乎要慢得多,大概是因为它必须遍历所有冻结的线程,但这为我的多线程调试带来了一些理智。
我刚刚发布了一个Visual Studio 2010+扩展,它可以完全满足您的需求。它是免费的:)。
介绍
此Visual Studio扩展添加了两个快捷键和工具栏按钮,以使开发人员在调试多线程应用程序时可以轻松地专注于单线程。
它极大地减少了手动进入“线程”窗口以冻结/解冻所有需要遵循的线程的需求,因此有助于提高生产率。
特征
将进一步执行限制为仅当前线程。将冻结所有其他线程。快捷方式:CTRL + T + T或“雪花”按钮。切换到下一个单线程(基于ID)。将更改当前线程并冻结所有其他线程。快捷键:CTRL + T + J或“下一步”按钮。
可以在图库,官方页面或Github存储库中查看。
如果像Web应用程序一样产生多个线程,则@MattFaus答案将不起作用。我所做的是以下
一个略有不同的做法,我使用:
假设您有时间在第二个线程达到断点之前执行上述操作。如果没有,并且其他线程在完成上述操作之前达到了断点,则可以在线程窗口中右键单击它们,然后选择冻结。
lock(m_someObject) { ; }
我建议在实时服务器上将应用程序的另一个实例添加到同一硬件或新机器上(将其群集),然后仅调试该实例。我不会在用户触发的代码中添加断点。如果这不是一个选择,我将添加更多跟踪。
但是,如果这绝对必要并且您需要解决方案统计信息,那么我可以确定您可以添加仅在请求来自您的IP地址时才中断的断点。您可以通过添加一个条件断点来进行检查HttpContext.Request.UserHostAddress
。但是请注意,这会大大降低您的应用程序的速度。
如果您不想停止所有其他线程(也许您将Visual Studio调试器附加到正在运行的需要响应请求的应用程序),则可以使用自动创建和删除断点的宏。
在Visual Studio中调试多线程程序时,对堆栈溢出问题“跨步”的答案中建议了这一点。
但是,该链接仅说明如何逐行调试。我建议您修改宏(如果您愿意的话),以使其修改所有断点(例如,在给定的行范围内)以仅在当前线程上停止。