WinDbg本身如何运作?

时间:2013-10-09 14:29:34

标签: windows windbg device-driver wdk wdm

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

我所做的研究:

我发现只有this链接说我正在谈论的事情很少。

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

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

2 个答案:

答案 0 :(得分:1)

@Kjelll答案是对的。以下是完整的方案,包括对您的评论的解释:

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

答案 1 :(得分:0)

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