|
|
|
|
|
|
|
Windows内核调试
帖子发起人: yushang 发起时间: 2009-09-28 15:43 下午 回复: 5
|
帖子排序:
|
|
|
|
2009-09-28, 15:43 下午
|
yushang
注册: 2009-08-10
发 贴: 27
|
|
|
参考张老师DPC挂死的文章,我机器上的!pcr输出,请高手帮忙分析分析:
DpcQueue:
0x8055b020 0x804dd2cd [Normal] nt!KiTimerExpiration
0x81a70bb8 0xf9b34043 [Normal] i8042prt!I8042MouseIsrDpc
0x81a70af0 0xf9b2e164 [Normal] i8042prt!I8042ErrorLogDpc
0x81ada01c 0xf98e05a6 [Normal] NDIS!ndisMDpc
DPC队列每次都有所不同,但一定都有ndisMDpc,这是不是说明和NIDS有关?应该再怎么向下分析呢?
kvn
# ChildEBP RetAddr Args to Child
00 f9eb3c94 804e4324 00000001 00000002 00000030 nt!RtlpBreakWithStatusInstruction (FPO: [1,0,0])
01 f9eb3c94 804e73c4 00000001 00000002 00000030 nt!KeUpdateSystemTime+0x165 (FPO
: [0,2] TrapFrame @ f9eb3ca8)
02 f9eb3d2c 804e73f7 805636e0 805636d8 804e65fc nt!ExpScanGeneralLookasideList+0
x36 (FPO: [2,1,0])
03 f9eb3d38 804e65fc 00000000 81bb7308 00000000 nt!ExAdjustLookasideDepth+0x32 (FPO: [0,0,0])
04 f9eb3dac 8057beff 00000000 00000000 00000000 nt!KeBalanceSetManager+0x88(FPO
: [1,24,0])
05 f9eb3ddc 804f98ea 804e657a 00000000 00000000 nt!PspSystemThreadStartup+0x34 (
FPO: [Non-Fpo])
06 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
为什么我的堆栈回溯看不出来是在哪个DPC中呢
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-29, 21:08 下午
|
yushang
注册: 2009-08-10
发 贴: 27
|
|
|
另外中断的线程(KeBalanceSetManager)级别是16
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-30, 09:44 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-30, 14:09 下午
|
yushang
注册: 2009-08-10
发 贴: 27
|
|
|
这是在Virtual PC 上运行一个使用TDI库的驱动时遇到的。按照您的DPC挂死的文章,我的堆栈回溯也应该到某个DPC中,但是奇怪的是居然是一个系统线程。出现挂死具有一定的随机性,但是90%的情况下都挂死
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-30, 20:33 下午
|
yushang
注册: 2009-08-10
发 贴: 27
|
|
|
呵呵,经过我亲自调试,找到问题原因了,和大家分享一下:是由于LookAside使用不当造成的:
1,发生挂死后每次陷入调试器发现都中断在nt!ExpScanGeneralLookasideList函数中,因此怀疑这个函数死循环了,检查函数,发现下面这段代码决定函数的返回:
nt!ExpScanGeneralLookasideList+0x85:
804e73d7 66895ed8 mov word ptr [esi-28h],bx
804e73db 8b36 mov esi,dword ptr [esi]
804e73dd 3b7508 cmp esi,dword ptr [ebp+8]
804e73e0 75c7 jne nt!ExpScanGeneralLookasideList+0x1b (804e73a9)
在804e73e0处下一个断点,发现每次esi都保持不变,并且都不等于ebp+8,因此jne总是跳转到前面代码而不是后面的退出代码。另外这个函数虽然不是DPC队列,但是在进入时会将IRQL提升到DPC级别,这解释了为什么界面不响应
2,在查找WDK中关于ExInitializeNPagedLookasideList函数的说明,有这么一句:
Drivers must always use explicitly free any lookaside lists they create before unloading. To do otherwise is a serious programming error
我的驱动没有按照这个来做,暂时把所有的LookAside改为直接Pool分配后问题消失
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-10-08, 22:25 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » Re: 系统挂死
|
|
|
|
|
|