客户老化发了个dmp文件 用windbg打开
view-》call stack
加载我们的pdb
增加pdb路径 重新reload
.sympath+ C:\symbols\xxx.PDB\2\2\2\
.reload /f /i C:\symbols\xxx.PDB\2\2\2\xxx.dll C:\symbols\xxx.PDB\2\2\2\xxx.pdb
重新运行
!analyze -v
我们根据栈回溯从上往下跟踪一下流程,先看一下出问题的函数
RtlpWaitOnCriticalSection+aa地址异常
反汇编ntdll 找到对应函数
从上面看到空指针的地方这些函数都没有操作,再往上查找就是我们的函数
但是这个调用的是windows api 传参也不是空指针
EnterCriticalSection(&dContext->KeyLock)
跟踪我们代码发现
void tthread(CONTEXT pContext)
{
EnterCriticalSection(&pContext->KeyLock)
}
testThread(
CONTEXT pContext
)
{
DWORD threadId;
BOOL ret = FALSE;
ENTER_DBG();
do {
//因为创建线程在前 InitializeCriticalSection在后
//有可能线程先跑起来 直接调用了EnterCriticalSection,如果线程跑起来的话可能InitializeCriticalSection还没有调用到
//keylock没有初始化完成 这时候访问可能会导致问题 这是个低概率问题,就看线程啥时候启动
pContext->ThreadHandle = CreateThread(0, 0, tthread,
pContext, 0, &threadId);
if (!_is_invalid_handle_(pContext->ThreadHandle)) {
ret = TRUE;
pContext->bShouldTerminateThr = FALSE;
}
else {
PLE("Failed to createThreadHandle!");
ret = FALSE;
break;
}
InitializeCriticalSection(&pContext->KeyLock);
} while (0);
LEAVE_DBG(ret);
}
dmp里面还能保存app的一部分log
查看log 命令
!wdfkd.wdfcrashdump
!wdfcrashdump xxx.dll