在Visual Studio,C ++中调试中断时设置默认线程

时间:2018-04-19 09:43:00

标签: c++ multithreading visual-studio debugging

我有一个使用Visual Studio开发的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;
    }

而我的非活动线程池在这里;

        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);  <-----

虽然它不是一件大事,但它是一个恒定的浪费时间。我猜测逻辑是调试器比其他代码更喜欢用户代码。

1 个答案:

答案 0 :(得分:1)

发生停止事件的线程是显示的线程。即使在Async-Break中也是如此(尽管这似乎是随机的,因为在这种情况下在所有线程上都设置了bps)。

基本上,它是这样做的:

1)暂停所有线程

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

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

4)如果没有命中bp(由于死锁),所有线程都被挂起并发送假停止事件(称为冻结异步中断)。在这种情况下,选择第一个线程。

你可能在当天写了一个宏来做这个,但今天,这需要一个插件或其他自动化客户端,因为我们已经没有宏了。