XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog

某正在运行的程序突然抛出异常,我们直接上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........

 

posted on 2023-02-20 11:27  不及格的程序员-八神  阅读(42)  评论(0编辑  收藏  举报