Windows2003的LoaderLock

来源:互联网 发布:adobe 编程字体 编辑:程序博客网 时间:2024/05/21 17:02

无论打开“添加/删除程序”、在“我的电脑”上右击属性、或是打开VS2003。都有一定几率无反应。

在进程管理器里,这些进程通常都是有2M内存已经分配,可以重新启动,未响应的进程还需要手动杀掉。

 

网上有介绍LoaderLock的文章:

http://msdn.microsoft.com/en-us/library/aa290048.aspx

但是我还没有细看,先放在这里收藏,以后再研究。

 

不过我可以先调试一下看看:

我用命令行“rundll32.exe /d shell32.dll,Control_RunDLL SYSDM.CPL”打开“系统属性”窗口,起了三次都正常,第四次死锁了。

用WinDbg查看调用堆栈:

0:000> kb
ChildEBP RetAddr  Args to Child             
0006ecc8 7c957d0b 7c96d236 0000077c 00000000 ntdll!KiFastSystemCallRet
0006eccc 7c96d236 0000077c 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0006ed08 7c96d281 0000077c 00000004 00000001 ntdll!RtlpWaitOnCriticalSection+0x1a3
0006ed28 7c95d243 7c9b77a0 00000000 00000002 ntdll!RtlEnterCriticalSection+0xa8
0006ed5c 7c964029 00000001 00000000 0006ed98 ntdll!LdrLockLoaderLock+0xe4
0006efcc 7c801bf3 00089940 0006f018 0006eff8 ntdll!LdrLoadDll+0xc9
WARNING: Stack unwind information not available. Following frames may be wrong.
0006f034 7c81c70b f6960e28 00000000 00000000 kernel32!LoadLibraryExW+0xe7
0006f078 77c43446 77c42f74 00088fc0 00080000 kernel32!LoadLibraryW+0x11
00000000 00000000 00000000 00000000 00000000 RPCRT4!I_RpcServerUseProtseq2A+0x833

 

反正是在LoadLibrary时锁的,其中红色字是锁住的临界代码地址

查看临界对象:

0:000> !locks

CritSec ntdll!LdrpLoaderLock+0 at 7c9b77a0
WaiterWoken        No
LockCount          2
RecursionCount     2
OwningThread       550
EntryCount         0
ContentionCount    4
*** Locked

CritSec RPCRT4!NdrServerCall+511 at 77cb8078
WaiterWoken        No
LockCount          1
RecursionCount     1
OwningThread       ca4
EntryCount         0
ContentionCount    1
*** Locked

CritSec ADVAPI32!SddlSidLookupCritical+0 at 77fa1700
WaiterWoken        No
LockCount          0
RecursionCount     1
OwningThread       ca4
EntryCount         0
ContentionCount    0
*** Locked

CritSec MSCTF!g_csInDllMain+0 at 74475000
WaiterWoken        No
LockCount          0
RecursionCount     1
OwningThread       ca4
EntryCount         0
ContentionCount    0
*** Locked

Scanned 162 critical sections

 

可以看到7c9b77a0这个地址所属线程ID为550

查看线程:

0:000> ~*
.  0  Id: db8.ca4 Suspend: 1 Teb: 7ffdf000 Unfrozen
      Start: rundll32!wWinMainCRTStartup (01001f98)
      Priority: 0  Priority class: 32  Affinity: 1
   1  Id: db8.918 Suspend: 1 Teb: 7ffde000 Unfrozen
      Start: kernel32!MulDiv+0x120 (7c8217ec)
      Priority: 0  Priority class: 32  Affinity: 1
   2  Id: db8.550 Suspend: 1 Teb: 7ffdc000 Unfrozen
      Start: kernel32!MulDiv+0x120 (7c8217ec)
      Priority: 0  Priority class: 32  Affinity: 1
   3  Id: db8.194 Suspend: 1 Teb: 7ffdb000 Unfrozen
      Start: ntdll!DbgUiRemoteBreakin (7c96fdb4)
      Priority: 0  Priority class: 32  Affinity: 1

 

线程ID为550的是编号为2的线程,切换到这个线程:

0:000> ~2s
eax=00000000 ebx=00000000 ecx=000883d8 edx=304893b1 esi=77cb8078 edi=00000000
eip=7c9585ec esp=00ace3e4 ebp=00ace420 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c9585ec c3              ret

 

查看调用堆栈:

0:002> kb
ChildEBP RetAddr  Args to Child             
00ace3e0 7c957d0b 7c96d236 00000764 00000000 ntdll!KiFastSystemCallRet
00ace3e4 7c96d236 00000764 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
00ace420 7c96d281 00000764 00000004 00000000 ntdll!RtlpWaitOnCriticalSection+0x1a3
00ace440 77c4342f 77cb8078 0008a888 00080000 ntdll!RtlEnterCriticalSection+0xa8
WARNING: Stack unwind information not available. Following frames may be wrong.

...

 

这个线程却在等待77cb8078这个临界地址,而从上述列出的临界对象中发现该临界地址所属线程ID为ca4,而ca4这个线程就是编号0的被锁住的那个线程

 

这样。。0线程在LoadLibrary里等2线程,2线程却在等0线程,就这么死锁了。。

我不知道这算不算LoaderLock,我记得Windows2000曾经有过类似的BUG

但是现在2003的这个是不是呢?还是卡巴斯基或是什么第三方软件造成的呢?

不得而知。。先留着,以后有兴趣且有时间了再看看吧。

 

原创粉丝点击