zoukankan      html  css  js  c++  java
  • 揭示WinDbg中工作空间的工作方式

    工作区对我来说总是有点混乱。我知道如何说服他们做我需要做的工作,但他们仍然有点神秘。最近我决定解决这个问题,只是为了知道他们是如何在幕后工作的。但在我向您展示我的调查之前,让我们讨论不同类型的工作区。Windbg使用几种内置类型,包括Base、User、Kernel、Remote、Processor Architecture、Per Dump和Per Executable。它还使用命名工作空间(或用户定义的工作空间)。当您执行特定类型的调试(例如实时用户模式、事后转储分析等)时,这些工作区将合并到最终环境中。这里有一个图表来说明工作区的可能组合。

    • 绿线是使用WinDbg打开转储文件的情况。在这种情况下,将使用基本工作区+每个转储工作区。注意:每个转储只意味着打开的每个转储文件都有自己的工作区。
    • 蓝线是使用WinDbg使用Base+User模式工作区实时调试正在运行的应用程序的场景。
    • 橙色线是WinDbg的一个例子,它用于在x86机器上执行实时内核调试。在本例中,windbg使用的是Base+Kernel+x86工作区。

    从图中可以看到windbg通常使用两个工作区的组合。当实时内核调试时,它使用三个工作区。

    那么工作空间里是什么呢?

    • 会话信息
      包括所有断点(bp)和异常和事件处理信息(sx设置);所有打开的源文件;所有用户定义的别名。
    • 配置设置
      包括符号路径;可执行映像路径;源路径;使用l+,l-(设置源选项)设置的当前源选项;日志文件设置;COM或1394内核连接设置(如果连接是使用图形界面启动的);每个打开的对话框中的最新路径(不保存工作区文件和文本文件路径);当前的.enable_unicode、.force_radix_output和.enable_long_status设置。
    • WinDbg图形界面
      WinDbg窗口的标题;自动打开反汇编设置;默认字体;桌面上WinDbg窗口的大小和位置;打开了哪些调试信息窗口;每个打开的窗口的大小和位置,包括窗口的大小、其浮动或停靠状态、是否与其他窗口有选项卡,以及其快捷菜单中的所有相关设置;调试器命令窗口中窗格边界的位置以及该窗口中的换行设置;工具栏和状态栏以及每个调试信息窗口上的各个工具栏是否可见;“寄存器”窗口的自定义;Calls窗口、Locals窗口和Watch窗口中的标志;在监视窗口中查看的项目;每个源窗口中的光标位置。

    所有这些设置(蓝色设置除外)都是累积应用的(首先是基本设置,然后是下一个工作区等)。上面的蓝色项仅从链中的最后一个工作区加载。为了在实际操作中显示这一点,我创建了一个简单的演练,以演示调试器工作区的使用。
    首先,我没有使用任何命令行选项就打开了windbg。当它在此休眠状态下打开时(没有附加到任何内容,也没有打开任何内容),它将使用基本工作区。如果我没有更改任何内容(例如窗口位置),则在开始调试时不会提示我使用任何工作区对话框。但是,如果我将调试器的主窗口移动到任何位置(我们将调用此位置1),然后执行下面突出显示的任何操作-

    我收到这个对话框的提示-

    在上面的对话框中选择“是”将我的更改集成到“基本”工作区中,因此窗口位置1现在是基本工作区的一部分。

    现在我要选择“Open Executable”并浏览到我们原来忠实的目标notepad.exe。打开二进制文件后,windbg使用Base+Notepad(每个可执行文件)。现在,我将再次移动调试器的主窗口(我们将调用此位置2),并选择“调试>停止调试”选项。由于窗口位置更改,系统将提示我以下内容-

    如果我选择“是”,windbg将在以后打开可执行记事本时使用窗口位置2。关闭notepad.exe可执行文件后,windbg将恢复为使用基本工作区。
    这次我将实际启动记事本(不是从调试器启动),并使用调试器附加到正在运行的notepad.exe进程。我们现在处于基本+用户模式。我移动了“调试器”窗口(新位置3),选择了“调试>停止调试”,并使用此对话框得到提示-

    选择“是”将在用户模式工作区中存储WinDbg窗口位置3。完成此步骤后,Windbg将再次使用基本工作区,因为我们已停止调试。
    为了进一步说明工作区,我将在目标虚拟机上附加一个,用于内核调试,但不打断。Windbg现在正在使用Base+Kernel。我又把窗户挪开了,一闯进来我就听到这个对话-

    我在对话中选择了“不”,因为我掌握了窍门。如果我再次移动窗口并键入qd(quit and detach)结束当前的内核调试会话,我将看到这个对话框-

    所以在结束会话之前,我们在Base+Kernel+AMD64。
    通过这个练习,我了解了为什么我通常创建一个命名的工作区,更改所有设置,并使用命令行选项-W打开我的工作区。希望这将清除工作空间中涉及的一些复杂性。这就是为什么调试器帮助文件建议在尽可能低的级别(即先基本,然后其他级别)进行所需的所有更改。

  • 相关阅读:
    第01组 Beta冲刺(5/5)
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
    第01组 Beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    2019 SDN上机第6次作业
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    第01组 Alpha事后诸葛亮
    第01组 Alpha冲刺(6/6)
  • 原文地址:https://www.cnblogs.com/yilang/p/12157743.html
Copyright © 2011-2022 走看看