Re: 初始断点
WinDbg
初始断点
迷途小羔羊
2008-08-15, 11:03 上午
我看了调式软件这本书,我发现在书中646页,里面有个为新进程创建第一个堆的栈回溯,但是由于进入windbg时在初始断点出停下,导致无法看书上所说的栈回溯,我想问一下,有没有什么方法能看到那个新进程创建第一个堆的栈回溯。
Re: 初始断点
格蠹老雷
2008-08-16, 13:39 下午
有几种让被调试进程更早中断到调试器的做法,比如启用模块加载事件或者进程创建事件(参考30.9节和图30-14)。
也就是在你当前的调试会话中,选择Debug>Event Filters...,选中Load Module,然后选中Enabled。
而后重新启动被调试程序,当WinDBG询问是否保存工作空间时,选保存。
0:000> .restart /f
CommandLine: C:\dig\dbg\author\code\bin\Debug\AcsVio.exe
WARNING: Inaccessible path: 'D:\new\SYMBOLS.PRI\retail'
Symbol search path is: SRV*d:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
ModLoad: 00400000 0042c000 AcsVio.exe
ModLoad: 7c900000 7c9b0000 ntdll.dll
eax=004011a0 ebx=7ffd8000 ecx=020ca435 edx=00000078 esi=014ef764 edi=014ef6f2
eip=7c810685 esp=0012fffc ebp=00000244 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000200
7c810685 ?? ???
这次中断的时机更早,使用!heap命令可以看到上没有任何堆:
0:000> !heap
No heaps to display.
You must specify the actual heap address since
array of process heaps is inaccessable
此时,对RtlCreateHeap函数埋下一个断点:
0:000> bp ntdll!RtlCreateHeap
然后让被调试程序继续执行:
0:000> g
接下来断点就会命中:
Breakpoint 0 hit
eax=00001003 ebx=7ffde000 ecx=00010000 edx=00000000 esi=00010000 edi=00011970
eip=7c92552a esp=0012ff54 ebp=0012ff74 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
ntdll!RtlCreateHeap:
7c92552a 68a4000000 push 0A4h
这时再使用栈观察命令,就可以看到了:
0:000> kn
# ChildEBP RetAddr
00 0012fb04 7c921e0a ntdll!RtlCreateHeap
01 0012fc94 7c921639 ntdll!LdrpInitializeProcess+0x4b7
02 0012fd1c 7c90eac7 ntdll!_LdrpInitialize+0x183
03 00000000 00000000 ntdll!KiUserApcDispatcher+0x7
使用gu命令可以执行完RtlCreateHeap,而后再使用!heap命令,就可以可看到一个堆了:
0:000> !heap
Index Address Name Debugging options enabled
1: 00140000