【问题标题】:Can I set a breakpoint in Visual Studio (c++) to break on a thread context switch?我可以在 Visual Studio (c++) 中设置断点以中断线程上下文切换吗?
【发布时间】:2010-06-15 18:41:06
【问题描述】:

我们只想中断某个线程。知道怎么做吗?我似乎无法找到打破这种情况的方法。

我应该在文本中更具体。正如标题所暗示的,我想将上下文切换到线程中。

【问题讨论】:

  • 为什么要闯入上下文切换到线程中?
  • 这样我就可以在线程启动时开始调试了。它使我的应用程序崩溃。

标签: visual-studio multithreading debugging breakpoints


【解决方案1】:

您需要设置断点过滤器。右键单击断点并选择过滤器选项。它将显示一个对话框,允许您将断点过滤到特定的线程 ID、线程名称、进程 ID、进程名称甚至机器名称。

如果我想让断点只在 id 为 42 的线程上起作用,我会使用以下过滤器表达式。

ThreadId = 42

【讨论】:

  • 是的,我知道这些。我想在线程启动或唤醒时设置断点。
  • ThreadId = 42 对我不起作用。 VisualStudio 调试器提示找不到 ThreadId。但是 $tid(当前线程的线程 ID)工作正常(codeproject.com/Articles/469416/…)。这是一个条件示例:$tid == 42
【解决方案2】:

如果有办法在用户模式调试器中执行此操作,我会感到惊讶。

想象一下:当线程 42 进入时,您设置了一个断点。断点命中。调试器被激活。现在另一个线程被激活,线程 42 不再活动!


我建议你从Sysinternals(现在是微软的一部分)尝试Process Monitor。您可以将其限制为仅捕获线程和进程事件,从而产生如下内容:

20:43:51.9162409    lsass.exe   440 Thread Create       SUCCESS Thread ID: 5420
20:43:51.9166730    lsass.exe   440 Thread Create       SUCCESS Thread ID: 7916
20:43:53.2990544    svchost.exe 736 Thread Create       SUCCESS Thread ID: 5540
20:43:53.7664146    svchost.exe 736 Thread Create       SUCCESS Thread ID: 7384
20:43:53.7985662    svchost.exe 736 Thread Create       SUCCESS Thread ID: 1888
20:43:54.2444922    wmiprvse.exe    3144    Thread Create       SUCCESS Thread ID: 6300
20:43:54.2466447    svchost.exe 736 Thread Create       SUCCESS Thread ID: 5636
20:43:54.2480367    wmiprvse.exe    3144    Thread Create       SUCCESS Thread ID: 6624
20:43:54.2515443    svchost.exe 736 Thread Create       SUCCESS Thread ID: 7392
20:43:55.5332047    devenv.exe  4640    Thread Exit     SUCCESS Thread ID: 4696, User Time: 0.0000000, Kernel Time: 0.0000000
20:43:55.9179052    Explorer.EXE    3176    Process Create  C:\WINDOWS\system32\verclsid.exe    SUCCESS PID: 3356, Command line: /S /C {2559A1F4-21D7-11D4-BDAF-00C04F60B9F0} /I {000214E6-0000-0000-C000-000000000046} /X 0x401
20:43:55.9179079    verclsid.exe    3356    Process Start       SUCCESS Parent PID: 3176
20:43:55.9179101    verclsid.exe    3356    Thread Create       SUCCESS Thread ID: 7108
20:43:55.9354621    verclsid.exe    3356    Thread Create       SUCCESS Thread ID: 940
20:43:55.9521113    verclsid.exe    3356    Thread Create       SUCCESS Thread ID: 2704
20:43:56.5259637    verclsid.exe    3356    Thread Exit     SUCCESS Thread ID: 2704, User Time: 0.0000000, Kernel Time: 0.0000000

您也可以进行各种其他过滤,这应该允许您保持实用程序运行直到问题发生,即使在生产中也是如此。

【讨论】:

  • 用户模式调试器在不同的进程中运行,所以对我来说这听起来可能。操作系统必须向调试器公开一些我没想到的东西。
  • @Joshua:仔细想想:这仍然是上下文切换。也许 OP 对“上下文切换”不感兴趣,而是对等待状态的变化感兴趣。
  • 我们正在尝试调试一个令人讨厌的问题,即线程由 3rd 方库启动。我们不确定该线程在进程初始化的哪个位置启动...我不确定如何诊断。
  • 我确实想通了。如果不是刚刚被抢占的该进程上的线程,则切换到该进程的任何线程时都会触发中断。
  • 感谢 John - 我们需要调试器在线程开始执行时中断。我不确定进程监视器信息将如何提供帮助。我想我错过了一些东西。我们正在逐步执行我们的代码——我们没有第三方的源代码,但我们想弄清楚初始化过程中发生了什么。 (如果可以的话)我们当然是在调试器中查看汇编程序
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多