-2

我最近开始开发 Windows 驱动程序。我想知道它实际上是如何调试我的驱动程序的。我的设置是 --> Win7 作为主机,XP 作为 VMware 上的来宾,我正在通过串口进行调试。

我做过的研究:

我发现只有这个链接说我在谈论的东西很少。

我已经知道调试器如何在单个操作系统上工作,在这种情况下,调试器也在同一个操作系统上,所以它知道哪个进程正在运行。这是可以理解的。但是在这里,调试器在完全不同的操作系统上,完全不同的环境。我只是说file->open source files,我可以设置断点!!此外,当我加载驱动程序时,它实际上在那里中断。我的意思是为什么../如何?XP的内核如何知道(驱动程序是内核的扩展,至少WDM,不知道WDK)有this驱动程序的源代码?那也超出了它的控制(环境)?我的意思是我可以打开 10 个带有断点的文件,但它工作得很好,我不能失败/欺骗它。

所以我的想法是,每当我们在 Win7 上向 windbg 添加源时,它都会从该源创建二进制文件,并且每当 XP 要加载任何二进制文件时,它都会检查这是否是 windbg 正在等待的二进制文件。上面链接中令人困惑的是,Vikrant 说调试器询问内核(XP)它是否愿意调试一个进程-> Bus HELLO ...进程在 XP 上运行,windbg 在 Win7 上运行并且不知道name or id进程. 它有源代码,但是考虑一个由 300 个文件构建的驱动程序的情况,并且只有一个可能是最简单的文件在 windbg 中打开,它与正在运行的驱动程序的源代码如何匹配?

4

2 回答 2

1

@Kjell 答案是正确的。这是完整的场景,包括对您的评论的解释:

  1. PDB 文件具有行信息。这是从每个(文件、行)位置到地址(RVA - 相对虚拟地址)的映射。
  2. 当您在源文件上设置断点时,WinDBG 会检查该源文件是否对应于当前地址。如果是 - 它设置断点。否则,它将成为“未来的断点”(不确定 Microsoft 是否使用此术语)。
  3. 当加载新的二进制文件时,客户端上的代理与主机通信,通知它有关二进制文件的信息。此时 - WinDBG 将尝试分配一个 PDB 文件。
  4. WinDBG 将从文件中嵌入的 PDB 位置开始。您可以使用以下命令行查看此值:windbg -dump -pdbpath xxx.sys. 这应该解释 WinDBG 将如何找到符号文件,即使不在.sympathy路径上(我相信这会回答您对 Kjell 的评论)。
  5. 然后 WinDBG 将搜索 .sympathy。
  6. 一旦符号被找到,它将查看所​​有未来的断点,如果适用,将设置一个实际的断点。
于 2013-10-12T19:09:42.660 回答
0

我认为您的链接很好地解释了您的问题,但是您可能还没有意识到 pdb 的机制对调试器有什么作用。主机操作系统上的 windbg 使用 pdb 文件将源文件中的行 nubers 转换为来宾操作系统 (xp) 中的地址。然后调试器代理使用此地址在来宾操作系统中设置断点(Int 3)。这与本地调试器对本地进程执行的方式非常相似。

于 2013-10-09T19:02:33.300 回答