我正在使用WinDBG调试项目。我遇到了一个奇怪的问题:
假设驱动程序映像名为foo.sys,并且有两个名为的源文件
src_1.c和src_2.c; src_2.c中有一个名为void f();
的函数。
第1步:
我使用OSRLoader成功地将foo.sys加载到内核中。
第2步:
我使用命令lm
检查符号是否已正确加载
kd> lm
...
...
8bad3000 8baec400 foo (private pdb symbols) d:\symbols\private\foo.pdb
...
...
并使用命令!itoldyouso
ti verify
kd> !itoldyouso foo d:\symbols\private\foo.pdb
foo.sys
Timestamp: 526DC759
SizeOfImage: 19400
pdb: f:\projects\foo\objchk_wxp_x86\i386\foo.pdb
pdb sig: 851C2562-6FE3-4391-88C6-320253CC3372
age: 1
foo.pdb
pdb sig: 851C2562-6FE3-4391-88C6-320253CC3372
age: 1
证明符号已正确加载。
第3步:
我可以在任何有效的代码行中在src_1.c中设置断点。
第4步:
我不能在src_2.c中设置任何断点,即使我关闭并重新加载src_2.c
从正确的位置。但是,如果我使用bu foo!f
在f
上设置断点,
它有效。
在foo!f
上设置断点后,执行将在foo!f
处断开
预期,我可以逐步进行源级调试。
但是,即使我可以在src_2.c中逐步进行源代码级调试,我仍然如此 不能通过按F9在src_2.c中设置任何断点。
根本原因是什么?
感谢。