在VisualStudio C++中调试时设置默认线程 我有一个使用VisualStudio开发的C++应用程序,它包括一个线程池,其中大多数线程大部分时间都在睡觉。如果我在调试时中断,比如在模式对话框中,调试器中出现的线程上下文总是我的一个休眠线程。是否有任何方法可以自动将其更改为选择主进程线程而不是休眠工作线程?当主线程不在AfxInternalPumpMessage处时,情况往往是这样的,因此我的主线程在这里 BOOL AFXAPI AfxInternalPumpMessage() { _AFX_THREAD_STATE *pState = AfxGetThreadState(); if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL)) <----- { #ifdef _DEBUG TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n"); pState->m_nDisablePumpCount++; // application must die #endif // Note: prevents calling message loop things in 'ExitInstance' // will never be decremented return FALSE; }

在VisualStudio C++中调试时设置默认线程 我有一个使用VisualStudio开发的C++应用程序,它包括一个线程池,其中大多数线程大部分时间都在睡觉。如果我在调试时中断,比如在模式对话框中,调试器中出现的线程上下文总是我的一个休眠线程。是否有任何方法可以自动将其更改为选择主进程线程而不是休眠工作线程?当主线程不在AfxInternalPumpMessage处时,情况往往是这样的,因此我的主线程在这里 BOOL AFXAPI AfxInternalPumpMessage() { _AFX_THREAD_STATE *pState = AfxGetThreadState(); if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL)) <----- { #ifdef _DEBUG TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n"); pState->m_nDisablePumpCount++; // application must die #endif // Note: prevents calling message loop things in 'ExitInstance' // will never be decremented return FALSE; },c++,multithreading,visual-studio,debugging,C++,Multithreading,Visual Studio,Debugging,当我的非活动线程池在这里时 if (pThreadInfo->m_pActivity) { SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_NORMAL); pThreadInfo->m_pActivity->Execute(); SetThreadPriority(pThreadInfo->m_

当我的非活动线程池在这里时

        if (pThreadInfo->m_pActivity)
        {
            SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_NORMAL);
            pThreadInfo->m_pActivity->Execute();
            SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_BELOW_NORMAL);
            pThreadInfo->m_pActivity = NULL;
        }
        else
            Sleep(50);  <-----

虽然这不是一件大事,但它总是在浪费时间。我猜逻辑是调试器更喜欢用户代码而不是其他代码。

发生停止事件的线程就是显示的线程。即使在异步中断中也是如此,尽管这看起来是随机的,因为在这种情况下所有线程上都设置了bps

本质上,它是这样做的:

1挂起所有线程

2在所有线程的ip上设置断点

3当其中一个bps命中时,删除所有bps并将该线程显示为选中状态

4如果由于死锁而未命中任何bp,则所有线程将保持挂起状态,并发送一个名为冻结异步中断的假停止事件。在这种情况下,选择第一个线程


您可以在当天编写一个宏来执行此操作,但今天,这将需要一个加载项或其他自动化客户端,因为我们已经没有宏了

要中断,请设置一个断点,例如在GetMessage之后,然后命中该断点的线程将是当前线程。如果您只是点击暂停,那么一个随机线程将是当前线程。@rustyx,我说的是在运行的应用程序上按break all。从我所看到的情况来看,选择的线程不是随机的,它更喜欢运行用户代码的线程。我希望能够排除低优先级线程,即休眠线程。