我正在用 WinDBG 调试一个项目。我遇到了一个奇怪的问题:
假设驱动镜像名为 foo.sys,有两个源文件名为 src_1.c 和 src_2.c;void f();
src_2.c 中有一个函数。
步骤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 中设置任何断点。
根本原因是什么?
谢谢。