我有一个BSOD的崩溃转储,我正在尝试分析。 WinDbg说这是一个游泳池腐败,但我想深入挖掘一下以提高我的调试技巧。这些是导致崩溃的线路:
fffff800`0300a998 498bf5 mov rsi,r13
fffff800`0300a99b 8bee mov ebp,esi
fffff800`0300a99d 498b842400010000 mov rax,qword ptr [r12+100h]
fffff800`0300a9a5 4885c0 test rax,rax
fffff800`0300a9a8 0f8443030000 je nt!ExDeferredFreePool+0x435 (fffff800`0300acf1)
fffff800`0300a9ae 498b942400010000 mov rdx,qword ptr [r12+100h]
fffff800`0300a9b6 488bfa mov rdi,rdx
fffff800`0300a9b9 0f1f00 nop dword ptr [rax]
fffff800`0300a9bc 4c8b02 mov r8,qword ptr [rdx] ds:002b:fbfffa80`2d3db3a0=????????????????
最后一行导致崩溃,因为它试图取消引用保存无效内存地址的rdx的值(fbfffa802d3db3a0不是规范形式)。但是......这个价值是如何被破坏的?如果我上升3行,r12 + 100h的地址将被移动到rdx:
fffff800`0300a9ae 498b942400010000 mov rdx,qword ptr [r12+100h]
此内存位置包含有效地址:
0: kd> dq r12+100h l1
fffff800`03065680 fffffa80`2f7c5870
在下一行中,rdx被复制到rdi:
fffff800`0300a9b6 488bfa mov rdi,rdx
此时,两个寄存器应保持相同的值。
这个与崩溃之间唯一的另一条线是:
fffff800`0300a9b9 0f1f00 nop dword ptr [rax]
在崩溃的那一刻,rdi保存了正确的地址,但rdx中的地址已损坏:
0: kd> .cxr fffff80000b90930
rax=fffffa8030f0a870 rbx=0000000000000000 rcx=fffff80003065e50
rdx=fbfffa802d3db3a0 rsi=fffffa803f0c0000 rdi=fffffa802f7c5870
NOP指令能否导致地址在rdx中发生变化?任何解释都将不胜感激。
谢谢!