返回列表 发帖

[BUG反馈] 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 编辑 ]
If freedom is outlawed, only outlaws will have freedom.

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 编辑 ]
If freedom is outlawed, only outlaws will have freedom.

TOP

没看懂,传说中的高手?

TOP

最新版本是2402,你知道吗?

{唵嘛呢叭咪吽}{南無阿彌陀佛}卍何者作意佛,佛安住彼前,恒时赐加持,解脱一切罪
XP3 Pro+IE8+TW3.X+TW Chrome

TOP

原帖由 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问题,或者已改了,当然最好不过。
If freedom is outlawed, only outlaws will have freedom.

TOP

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


高手真的不敢当。只是多作了几年编程的工作而已。
If freedom is outlawed, only outlaws will have freedom.

TOP

建议楼主直接跟开发组联系

TOP

我用的是2.4F。。。最近也经常假死。。 难道是与广告规矩有关系?

TOP

多谢楼主的热心, 我会去检查代码看看是否有这样的情况的。 浏览器假死的情况, 很多都是IE内核导致的, 和shell这一层关系不大。
遇到崩溃假死或者感觉速度慢或者其他问题的朋友可以先试试使用TW3
TheWorld we explore the world.

TOP

返回列表