Visual studio 我可以在VisualStudio(c++)中设置断点以在线程上下文开关上断开吗?
我们只想打断一条线。你知道怎么做吗?在那种情况下,我似乎找不到打破僵局的办法Visual studio 我可以在VisualStudio(c++)中设置断点以在线程上下文开关上断开吗?,visual-studio,multithreading,debugging,breakpoints,Visual Studio,Multithreading,Debugging,Breakpoints,我们只想打断一条线。你知道怎么做吗?在那种情况下,我似乎找不到打破僵局的办法 我应该在课文中说得更具体些。正如标题所示,我想将上下文切换中断到线程中。您需要设置断点过滤器。右键单击断点并选择过滤器选项。它将显示一个对话框,允许您将断点筛选为特定的线程ID、线程名称、进程ID、进程名称甚至机器名称 如果我希望断点只在id为42的线程上起作用,我将使用以下过滤器表达式 ThreadId = 42 如果在用户模式调试器中有这样做的方法,我会感到惊讶 想象一下:您为线程42被切换时设置了一个断点。断点
我应该在课文中说得更具体些。正如标题所示,我想将上下文切换中断到线程中。您需要设置断点过滤器。右键单击断点并选择过滤器选项。它将显示一个对话框,允许您将断点筛选为特定的线程ID、线程名称、进程ID、进程名称甚至机器名称 如果我希望断点只在id为42的线程上起作用,我将使用以下过滤器表达式
ThreadId = 42
如果在用户模式调试器中有这样做的方法,我会感到惊讶 想象一下:您为线程42被切换时设置了一个断点。断点命中。调试器已激活。现在,另一个线程被激活,线程42不再处于活动状态 我建议你从现在开始尝试微软的一部分。您可以将其限制为仅捕获线程和进程事件,从而产生如下结果:
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
您还可以执行各种其他筛选,这将允许您在问题出现之前一直运行该实用程序,即使在生产中也是如此。是的,我知道这些。我希望在启动或唤醒线程时设置断点。ThreadId=42对我不起作用。VisualStudio调试器发现未找到ThreadId。但是$tid当前线程的线程ID可以正常工作。这是一个条件示例:$tid==42用户模式调试器在另一个进程中运行,因此我觉得这是可能的。操作系统将不得不向调试器公开一些我并不期望的东西。@Joshua:仔细想想:这仍然是一个上下文切换。也许OP对上下文切换不感兴趣,而是对等待状态的更改感兴趣。我们正在尝试调试一个令人讨厌的问题,其中一个线程是由第三方库启动的。我们不确定该线程在初始化过程中从何处启动。。。我不知道该怎么诊断,我确实想得很清楚。如果不是这个进程上的线程被抢占,那么在切换到这个进程的任何线程时都会出现中断。谢谢John-当线程开始执行时,我们需要调试器中断。我不确定进程监视器信息将如何发挥作用。我想我错过了什么。我们正在逐步完成我们的代码——我们没有第三方的源代码,但是我们想弄清楚初始化过程中发生了什么。如果可以的话,我们现在当然在调试器中查看汇编程序,为什么要将上下文开关打断到线程中?这样我就可以在线程启动时开始调试线程。它使我的应用程序崩溃。