某正在运行的程序突然抛出异常,我们直接上Windbg查看异常记录,.exr -1;!gle;结果并没有相关信息,异常被截获后并没有抛出来,这个错误对话不是系统的而是本身程序代码弹出的。
kp查看UI线程调用栈
0:000> kp # ChildEBP RetAddr 00 00197eac 77138065 win32u!NtUserGetMessage+0xc 01 00197eec 5f43bb2b USER32!GetMessageA+0x55 02 00197f14 5f43466f MFC42D!CWinThread::PumpMessage(void)+0x30 [thrdcore.cpp @ 821] 03 00197f50 5f436a6f MFC42D!CWnd::RunModalLoop(unsigned long dwFlags = 4)+0x202 [wincore.cpp @ 3489] 04 00197fb0 038146c4 MFC42D!CDialog::DoModal(void)+0x191 [dlgcore.cpp @ 539] WARNING: Stack unwind information not available. Following frames may be wrong. 05 0019818c 0096750b CodeBook_d!CWarehouseListDlg::OnCodeExit+0x19bf96 //警告:这个dll的栈帧显示是错的,没有栈回溯信息。 06 00198c98 0096728e JXC_MED_YX_EX_d!CHomePageView::LoadWarnlist+0xfb [..\HomePageView.cpp @ 699]
复制一个最新的pdb符号文件到目录下,强制重新加载这个dll
0:000> !sym noisy //打开加载符号过程分析,看看符号为什么没有正确加载,原因是版本不匹配。!sym quiet关闭开关 noisy mode - symbol prompts on DBGHELP: Debug\CodeBook_d.pdb -mismatched pdb 0:000> .reload /f CodeBook_d.dll SYMSRV: BYINDEX: 0x6 \DebuggingPaths\dbg\symCodeBook_d.dll DBGHELP: debug\CodeBook_d.dll cached to \DebuggingPaths\dbg\sym\CodeBook_d.dll\63F2EC2F5b8000\CodeBook_d.dll DBGHELP: \DebuggingPaths\dbg\sym\CodeBook_d.dll\63F2EC2F5b8000\CodeBook_d.dll - OK 0:000> lm start end module name 02810000 02dc8000 CodeBook_d C (private pdb symbols) \DebuggingPaths\dbg\sym\CodeBook_d.pdb\63F2CE3D3\CodeBook_d.pdb
0:000> kp //重新加载后函数显示出来了 # ChildEBP RetAddr 00 00197eac 77138065 win32u!NtUserGetMessage+0xc 01 00197eec 5f43bb2b USER32!GetMessageA+0x55 02 00197f14 5f43466f MFC42D!CWinThread::PumpMessage(void)+0x30 [thrdcore.cpp @ 821] 03 00197f50 5f436a6f MFC42D!CWnd::RunModalLoop(unsigned long dwFlags = 4)+0x202 [wincore.cpp @ 3489] 04 00197fb0 029b4b34 MFC42D!CDialog::DoModal(void)+0x191 [dlgcore.cpp @ 539] 05 0019818c 0096750b CodeBook_d!ReportError+0x434 [\glbCodeBook.cpp @ 4723] 06 00198c98 0096728e JXC_MED_YX_EX_d!CHomePageView::LoadWarnlist+0xfb [\HomePageView.cpp @ 699]
反汇编 0096750b 这个返回地址 直接看调用弹出对话框的代码源码:
0:000> u 0096750b JXC_MED_YX_EX_d!CHomePageView::LoadWarnlist+0xfb [..\HomePageView.cpp @ 699]: 0096750b 83c408 add esp,8 0096750e 3bf4 cmp esi,esp 00967510 e8db742f00 call JXC_MED_YX_EX_d!chkesp (00c5e9f0) 00967515 b81b759600 mov eax,offset JXC_MED_YX_EX_d!CHomePageView::LoadWarnlist+0x10b (0096751b) 0096751a c3 ret
FX_EXT_CLASS void ReportError(CDBException *e, LPCTSTR lpszDescription) { CString strError; ... CErrorDlg dlg(lpszDescription, e == NULL ? _T("") : strError); dlg.DoModal();//弹出了那个错误对话框;对话框中的文本被写成了“加载警告列表出错。”,windbg中的源码不能正确显示中文,需要将源码格式存成utf-8。 }
现在这个异常已经很明显了,被包装了但并没有把原来的异常信息打到对话框上,现在我们使用EBP寄存器来查看异常的结构内容:
EBP 当前存放父函数前ebp的值,那么EBP+4指向的是CALL指令压人的函数返回地址(0096750b);
EBP+8是父函数压在栈上的第—个参数(0a052410);这个地址就是CDBException的实例,查看结构信息并显示错误字段文本内容:
0:000> dd 0019818c //查看EBP栈参数 0019818c 00198c98 0096750b 0a052410 012a30a4
0:000> dt CDBException 0a052410 MFC42D!CDBException +0x000 __VFN_table : 0x5f7326f0 =5f4ada50 classCObject : CRuntimeClass =5f4adbc8 classCException : CRuntimeClass +0x004 m_bAutoDelete : 0n1 +0x008 m_bReadyForDelete : 0n0 +0x00c m_nRetCode : 0n-1 +0x010 m_strError : CString +0x014 m_strStateNativeOrigin : CString 0:000> da poi(0a052410+0x14) //错误的文本内容 09dde69c "State:S1000,Native:0,Origin:[Mic" 09dde6bc "rosoft][ODBC SQL Server Driver]."
这个异常是什么意思呢?从另一个错误字段m_strError指向的地址内容找,中文显示不出来
0:000> db 0x09399dbc L100 09399dbc c1 ac bd d3 d5 bc cf df-b5 bc d6 c2 c1 ed d2 bb ................ 09399dcc b8 f6 20 68 73 74 6d 74-0a 00 fd fd fd fd ad ba .. hstmt........ 09399ddc 0d f0 ad ba ab ab ab ab-ab ab ab ab 00 00 00 00 ................
实际上中文的内容为:
连接占线导致另一个HStmt,导至这个原因是正在获取这个数据集太大了,占居了很长时间的SQL游标执时间,解决方案就是减少结果输出。
另一个困惑:同样是CString,一个可以正常显示,另一个却是‘?’号呢
0:000> dt -r2 CDBException 09399c38 MFC42D!CDBException +0x010 m_strError : CString +0x000 m_pchData : 0x09399dbc "???" +0x014 m_strStateNativeOrigin : CString +0x000 m_pchData : 0x09399d24 "State:S1000,Native:0,Origin:[Microsoft][ODBC SQL Server Driver]."
0:000> db 0x09399dbc L20 09399dbc c1 ac bd d3 d5 bc cf df-b5 bc d6 c2 c1 ed d2 bb ................ 09399dcc b8 f6 20 68 73 74 6d 74-0a 00 fd fd fd fd ad ba .. hstmt........
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.