Board logo

标题: [BUG反馈] 2.4.0.1假死,memory dump,分析和建议 [打印本页]

作者: backfire    时间: 2009-1-22 13:29     标题: 2.4.0.1假死,memory dump,分析和建议

1. 环境:
tw :多语言 2.4.0.1 zip版本
OS:Windows 2003 server 英文版,5.2.3790, sp2
IE 7.0.5730.13  (128-bit cipher)
系统内存>4GB
2. 现象
打开网页或浏览时,失去了响应。网页一般在30~50个之间,出问题的网页不一定。试过新目录,重新注册IE相关dll等,都会不定时出现这个问题。最后只能直接kill了。
3. memory dump
问题再出现时,attach到windbg里面,.dump /ma。 相关大致结果如下:
  1. ...
  2. 0:000> .ecxr
  3. ...
  4. 0:000> !analyze -v -hang
  5. ...
  6. FAULTING_IP:
  7. +0
  8. 00000000 ??              ???
  9. EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
  10. ExceptionAddress: 00000000
  11.    ExceptionCode: 80000007 (Wake debugger)
  12.   ExceptionFlags: 00000000
  13. NumberParameters: 0
  14. BUGCHECK_STR:  80000007
  15. PROCESS_NAME:  TheWorld.exe
  16. ERROR_CODE: (NTSTATUS) 0x80000007 - {Kernel Debugger Awakened}  the system debugger was awakened by an interrupt.
  17. EXCEPTION_CODE: (HRESULT) 0x80000007 (2147483655) - Operation aborted
  18. NTGLOBALFLAG:  0
  19. APPLICATION_VERIFIER_FLAGS:  0
  20. LOADERLOCK_BLOCKED_API:  GetModuleFileNameW:LdrLockLoaderLock:
  21. DERIVED_WAIT_CHAIN:  
  22. Dl Eid Cid     WaitType
  23. -- --- ------- --------------------------
  24.    5   e60.e70 Critical Section      
  25. WAIT_CHAIN_COMMAND:  ~5s;k;;
  26. BLOCKING_THREAD:  00000e70
  27. DEFAULT_BUCKET_ID:  APPLICATION_HANG_Orphaned_CriticalSection
  28. PRIMARY_PROBLEM_CLASS:  APPLICATION_HANG_Orphaned_CriticalSection
  29. LAST_CONTROL_TRANSFER:  from 7c827d0b to 7c8285ec
  30. FAULTING_THREAD:  00000005
  31. STACK_TEXT:  
  32. 03a4f268 7c827d0b 7c83d236 00000148 00000000 ntdll!KiFastSystemCallRet
  33. 03a4f26c 7c83d236 00000148 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
  34. 03a4f2a8 7c83d281 00000148 00000004 00000001 ntdll!RtlpWaitOnCriticalSection+0x1a3
  35. 03a4f2c8 7c82d243 7c8877a0 4b3c0000 7c8877ec ntdll!RtlEnterCriticalSection+0xa8
  36. 03a4f2fc 77e63cd8 00000001 00000000 03a4f338 ntdll!LdrLockLoaderLock+0xe4
  37. 03a4f35c 77390f3d 4b3c0000 03a4f3b0 00000104 kernel32!GetModuleFileNameW+0x77
  38. 03a4f370 77390f13 4b3c0000 03a4f3b0 00000104 user32!WowGetModuleFileName+0x14
  39. 03a4f5bc 7738fe09 4b3c0000 00000160 00000003 user32!LoadIcoCur+0x76
  40. 03a4f5e4 773a0bc7 4b3c0000 00000160 00000001 user32!LoadImageW+0x7c
  41. 03a4f604 4b3f7906 4b3c0000 00000160 00000001 user32!LoadImageA+0x6c
  42. 03a4f624 4b3c99b8 1b9ff500 03a4f660 03a95700 MSCTF!CLBarItemWin32IME::GetIcon+0x24
  43. 03a4f658 4b3c9a0d 0d89c540 04de0278 03a4f8d8 MSCTF!CStubITfLangBarItemButton::stub_GetIcon+0x1b
  44. 03a4f668 4b3c93b0 04de0278 0001028c 00000002 MSCTF!CStubITfLangBarItemButton::Invoke+0x14
  45. 03a4f8d8 4b3c922d 00000ab8 00000028 03a4fa7c MSCTF!HandleSendReceiveMsg+0x171
  46. 03a4fa04 7739b6e3 0001028c 0000c0ae 00000ab8 MSCTF!CicMarshalWndProc+0x161
  47. 03a4fa30 7739b874 4b3c6b73 0001028c 0000c0ae user32!InternalCallWinProc+0x28
  48. 03a4faa8 7739ba92 00000000 4b3c6b73 0001028c user32!UserCallWinProcCheckWow+0x151
  49. 03a4fb10 7739bad0 03a4ff58 00000000 03a4ff84 user32!DispatchMessageWorker+0x327
  50. 03a4fb20 00496cb9 03a4ff58 00000000 02da9248 user32!DispatchMessageW+0xf
  51. WARNING: Stack unwind information not available. Following frames may be wrong.
  52. 03a4ff84 77bcb530 02dc1478 00000000 00000000 TheWorld+0x96cb9
  53. 03a4ffb8 77e64829 014e1308 00000000 00000000 msvcrt!_endthreadex+0xa3
  54. 03a4ffec 00000000 77bcb4bc 014e1308 00000000 kernel32!BaseThreadStart+0x34

  55. FOLLOWUP_IP:
  56. MSCTF!CLBarItemWin32IME::GetIcon+24
  57. 4b3f7906 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]
  58. SYMBOL_STACK_INDEX:  a
  59. SYMBOL_NAME:  MSCTF!CLBarItemWin32IME::GetIcon+24
  60. FOLLOWUP_NAME:  MachineOwner
  61. MODULE_NAME: MSCTF
  62. IMAGE_NAME:  MSCTF.dll
  63. DEBUG_FLR_IMAGE_TIMESTAMP:  45d70ab2
  64. STACK_COMMAND:  ~5s ; kb
  65. BUCKET_ID:  80000007_MSCTF!CLBarItemWin32IME::GetIcon+24
  66. FAILURE_BUCKET_ID:  APPLICATION_HANG_Orphaned_CriticalSection_80000007_MSCTF.dll!CLBarItemWin32IME::GetIcon
  67. Followup: MachineOwner
复制代码
进一步的lock分析:
  1. 0:000> !locks
  2. CritSec ntdll!LdrpLoaderLock+0 at 7c8877a0
  3. WaiterWoken        No
  4. LockCount          6
  5. RecursionCount     1
  6. OwningThread       d6c
  7. EntryCount         0
  8. ContentionCount    2c9
  9. *** Locked
  10. CritSec mshtml!g_csTimerMan+0 at 43599128
  11. WaiterWoken        No
  12. LockCount          0
  13. RecursionCount     1
  14. OwningThread       d6c
  15. EntryCount         0
  16. ContentionCount    0
  17. *** Locked
  18. Scanned 3578 critical sections
  19. 0:000> ~~[d6c]
  20.              ^ Illegal thread error in '~~[d6c]'
  21. 0:000>~
  22. ...
复制代码
根本没有发现tid=d6c的线程。前面的!analyze -v -hang已给出结果:

DEFAULT_BUCKET_ID:  APPLICATION_HANG_Orphaned_CriticalSection

再看:
  1. 0:000> ~5s
  2. eax=fffe0000 ebx=00000000 ecx=00000000 edx=00000000 esi=7c8877a0 edi=00000000
  3. eip=7c8285ec esp=03a4f26c ebp=03a4f2a8 iopl=0         nv up ei pl zr na pe nc
  4. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
  5. ntdll!KiFastSystemCallRet:
  6. 7c8285ec c3              ret
  7. 0:005> kv 100
  8. ChildEBP RetAddr  Args to Child              
  9. 03a4f268 7c827d0b 7c83d236 00000148 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
  10. 03a4f26c 7c83d236 00000148 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0])
  11. 03a4f2a8 7c83d281 00000148 00000004 00000001 ntdll!RtlpWaitOnCriticalSection+0x1a3 (FPO: [2,7,4])
  12. 03a4f2c8 7c82d243 7c8877a0 4b3c0000 7c8877ec ntdll!RtlEnterCriticalSection+0xa8 (FPO: [1,1,0])
  13. 03a4f2fc 77e63cd8 00000001 00000000 03a4f338 ntdll!LdrLockLoaderLock+0xe4 (FPO: [SEH])
  14. 03a4f35c 77390f3d 4b3c0000 03a4f3b0 00000104 kernel32!GetModuleFileNameW+0x77 (FPO: [SEH])
  15. 03a4f370 77390f13 4b3c0000 03a4f3b0 00000104 user32!WowGetModuleFileName+0x14 (FPO: [3,0,0])
  16. 03a4f5bc 7738fe09 4b3c0000 00000160 00000003 user32!LoadIcoCur+0x76 (FPO: [6,139,4])
  17. 03a4f5e4 773a0bc7 4b3c0000 00000160 00000001 user32!LoadImageW+0x7c (FPO: [6,0,0])
  18. 03a4f604 4b3f7906 4b3c0000 00000160 00000001 user32!LoadImageA+0x6c (FPO: [6,0,0])
  19. 03a4f624 4b3c99b8 1b9ff500 03a4f660 03a95700 MSCTF!CLBarItemWin32IME::GetIcon+0x24 (FPO: [2,0,0])
  20. 03a4f658 4b3c9a0d 0d89c540 04de0278 03a4f8d8 MSCTF!CStubITfLangBarItemButton::stub_GetIcon+0x1b (FPO: [2,6,4])
  21. 03a4f668 4b3c93b0 04de0278 0001028c 00000002 MSCTF!CStubITfLangBarItemButton::Invoke+0x14 (FPO: [1,0,0])
  22. 03a4f8d8 4b3c922d 00000ab8 00000028 03a4fa7c MSCTF!HandleSendReceiveMsg+0x171 (FPO: [SEH])
  23. 03a4fa04 7739b6e3 0001028c 0000c0ae 00000ab8 MSCTF!CicMarshalWndProc+0x161 (FPO: [4,68,4])
  24. 03a4fa30 7739b874 4b3c6b73 0001028c 0000c0ae user32!InternalCallWinProc+0x28
  25. 03a4faa8 7739ba92 00000000 4b3c6b73 0001028c user32!UserCallWinProcCheckWow+0x151 (FPO: [SEH])
  26. 03a4fb10 7739bad0 03a4ff58 00000000 03a4ff84 user32!DispatchMessageWorker+0x327 (FPO: [SEH])
  27. 03a4fb20 00496cb9 03a4ff58 00000000 02da9248 user32!DispatchMessageW+0xf (FPO: [1,0,0])
  28. WARNING: Stack unwind information not available. Following frames may be wrong.
  29. 03a4ff84 77bcb530 02dc1478 00000000 00000000 TheWorld+0x96cb9
  30. 03a4ffb8 77e64829 014e1308 00000000 00000000 msvcrt!_endthreadex+0xa3 (FPO: [SEH])
  31. 03a4ffec 00000000 77bcb4bc 014e1308 00000000 kernel32!BaseThreadStart+0x34 (FPO: [SEH])
复制代码
比较典型的Orphaned Critical Section。

[ 本帖最后由 backfire 于 2009-1-22 13:33 编辑 ]
作者: backfire    时间: 2009-1-22 13:30

4.分析
一种可能出问题的代码如下,
  1. ...
  2. CRITICAL_SECTION g_cs;

  3. DWORD WINAPI ThreadProc(LPVOID lpParam)
  4. {
  5.   ...
  6.   try
  7.   {
  8.     EnterCriticalSection(&g_cs);
  9.     3rdPartyCode(lpParam);
  10.     LeaveCriticalSection(&g_cs);
  11.    }
  12.   catch(...)
  13.   {
  14.    ...
  15.   }
  16.   ...
  17. }
复制代码
一旦3rdPartyCode() --这里很可能就是IE的内核api,出问题退出,貌似起保护左右的try/catch,其实对CriticalSection一点用都没有,于是Orphan就出现了。。。。



5. 建议
采用CS类,如下:
  1. class CCriticalSection
  2. {
  3. piublic:
  4.   CCriticalSection(CRITICAL_SECTION* pCs)
  5.   {
  6.     m_pCs = pCs;
  7.     if(m_pCs)
  8.       EnterCriticalSection(m_pCs);
  9.   }

  10.   ~CCriticalSection()
  11.   {
  12.   if(m_pCs)
  13.     LeaveCriticalSection(m_pCs);
  14.   }

  15. private:
  16.   CRITICAL_SECTION* m_pCs;
  17. }
复制代码




改写后的thread函数如下:
  1. DWORD WINAPI ThreadProc(LPVOID lpParam)
  2. {
  3.   ...
  4.   CCriticalSection cs(&g_cs)
  5.   try
  6.   {
  7.     //EnterCriticalSection(&g_cs);
  8.     3rdPartyCode(lpParam);
  9.     //LeaveCriticalSection(&g_cs);
  10.    }
  11.   catch(...)
  12.   {
  13.    ...
  14.   }
  15.   ...
  16. }
复制代码
还有一种可能导致Orphaned CS的状况就是直接在是否CS前调用TerminateThread();相信开发组不会犯这种低级错误;
但有一点要注意,Win32 API函数如HeapAlloc等,内部却是隐含CS的,因此虽然代码中可能显式EnterCriticalSection,但
其实还是可能在HeapAlloc执行中异常退出,导致Orphaned CS。。。

不知道开发组是否使用微软的Applicaiton Verifier(appverf)之类的工具作检查?像上面第2种隐藏问题, appverf是可以查出的。


另外: 如果可能,开发组是否能放出TW相关的pdb文件?或者在有请求的情况下,有条件地发放给相关人员? 这样也便于更好的测试。

[ 本帖最后由 backfire 于 2009-1-22 13:31 编辑 ]
作者: hhzxedu    时间: 2009-1-22 13:47

没看懂,传说中的高手?
作者: nov.six    时间: 2009-1-22 13:51

最新版本是2402,你知道吗?
作者: backfire    时间: 2009-1-22 14:33

原帖由 nov.six 于 2009-1-22 13:51 发表 http://bbs.ioage.com/cn/images/common/back.gif
最新版本是2402,你知道吗?


我已经知道了。但2.3.x以来的几个版本都有问题,我都保留了dump,但都无瑕作仔细的分析(没pdb也不好办),只是最近几天2.4.0.1几乎隔天就要假死一下,于是大致看了几个以前和这最新的dump,发现了这个问题。

2402我还没有用,但已下载。。。

如果没有这个code问题,或者已改了,当然最好不过。
作者: backfire    时间: 2009-1-22 14:38

原帖由 hhzxedu 于 2009-1-22 13:47 发表 http://bbs.ioage.com/cn/images/common/back.gif
没看懂,传说中的高手?


高手真的不敢当。只是多作了几年编程的工作而已。
作者: tinham    时间: 2009-1-22 15:47

建议楼主直接跟开发组联系
作者: 积累    时间: 2009-1-22 16:47

我用的是2.4F。。。最近也经常假死。。 难道是与广告规矩有关系?
作者: mutalisker    时间: 2009-2-4 15:31

多谢楼主的热心, 我会去检查代码看看是否有这样的情况的。 浏览器假死的情况, 很多都是IE内核导致的, 和shell这一层关系不大。




欢迎光临 世界之窗论坛 (http://bbs.theworld.cn/) Powered by Discuz! 7.2