gpt4 book ai didi

c++ - 在 Visual Studio、C++ 中调试时设置默认线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:12 26 4
gpt4 key购买 nike

我有一个使用 Visual Studio 开发的 C++ 应用程序,其中包含一个线程池,其中大多数线程大部分时间都在休眠。如果我在调试时中断,比如在模态对话框中,调试器中出现的线程上下文总是我的休眠线程之一。有什么方法可以自动更改它以选择主进程线程而不是 sleep 工作线程?当主线程不在 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); <-----

虽然这不是什么大事,但它一直在浪费时间。我猜逻辑是调试器偏爱用户代码而不是其他代码。

最佳答案

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

本质上,它是这样做的:

1) 挂起所有线程

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

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

4) 如果没有命中 bp(因为死锁),所有线程都将暂停并发送一个假的停止事件(称为 frozen async-break)。在这种情况下,选择第一个线程。

在过去,您可以编写一个宏来执行此操作,但今天,这将需要一个插件或其他自动化客户端,因为我们不再有宏了。

关于c++ - 在 Visual Studio、C++ 中调试时设置默认线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49917795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com