1、现象
最近项目中调出一个bug,某些时候程序会卡死不动,用windbg进行加载后用 ~*kb 命令列出所有的线程栈调用,发现有多个线程调用 WaitForMultipleObjects 在等待同一个内核对象:
输入 !handle cc f 命令列出该内核对象的详细信息:
发现是是一个Mutex对象,对象名是 Mutex_DebugMsg2 ,查找代码知道这个Mutex是用写log时锁定文件写入用的。代码如下:
BOOL CDebugMsg::WriteLogA(LPSTR pszLog) { #ifdef _WRITEDEBUGMSGLOG BOOL bRet = FALSE; if (WaitForSingleObject(m_hMutex, INFINITE) != WAIT_OBJECT_0) { return bRet; } FILE* fp = _tfopen(m_ptszLogPath, _T("a+")); if (fp) { TCHAR ptszTime[16] = {0}; char pszWriteMsg[MAXDEBUGMSGCHARNUM] = {0}; GetTimeString(ptszTime); USES_CONVERSION; _snprintf(pszWrit