wenmo8 发布的文章

1.4、调试菜单

调试相关操作的功能菜单在这个下面,比如单步执行等。

  • Go

    单击Go调试菜单恢复 (或开始) 在目标上的执行。 此执行将继续,直到抵达某个断点、 异常或事件发生时,该过程结束或调试器将中断目标。此命令相当于按 F5 或单击 (F5) 转按钮 (转按钮的屏幕截图) 工具栏上。

  • 转到未经处理异常
    单击转未经处理的异常上调试恢复目标上的执行,并将当前异常视为未经处理的菜单。
  • 转到已处理异常
    单击转处理异常上调试恢复目标上的执行,以处理当前异常,为已处理的菜单。
  • 重启
    单击重新启动上调试菜单可停止目标的执行和最终目标进程和所有线程。 然后,此命令重新启动该过程开始时目标执行。此命令相当于按 CTRL + SHIFT + F5 或单击重新启动 (Ctrl + Shift + F5) 按钮 (重新启动按钮的屏幕截图) 工具栏上。
  • 停止调试

    在调试菜单上单击停止调试可停止目标的执行和最终目标进程和所有线程。 此操作,可以启动不同的目标应用程序进行调试。此命令相当于按 SHIFT + F5 或单击停止调试 (Shift + F5) 按钮 (停止调试按钮的屏幕截图) 工具栏上。

  • 分离调试对象

    单击分离调试对象菜单断开与目标应用程序并使其继续运行。

    在下列情况之一,支持从目标中分离:


    • 调试正在运行的用户模式目标。

    • Noninvasively 调试用户模式下的目标。







    如果你正在调试在 Windows 2000 上的实时目标分离调试对象命令将不可用,因为此版本的 Windows 不支持从目标进程中分离。
  • 中断

    单击中断调试菜单以终止的目标执行并返回到调试器。在用户模式下,此命令停止进程和线程,您可以重新获取调试器的控制。 在内核模式下,此命令将分成在目标计算机。在调试器处于活动状态时,还可以使用此命令。 在此情况下,该命令将长时间截断调试器命令窗口显示。中断命令等效于按 CTRL + BREAK 或单击中断 (Ctrl + Break) 按钮 (中断按钮的屏幕截图) 工具栏上。


    ALT+DEL


    可以使用ALT + DEL发送中断ALT + DEL的工作方式相同中断 (Ctrl + Break)。


    用户模式下的效果


    在用户模式下中断命令导致目标应用程序进入调试器。 目标应用程序会停止,调试器将变为活动状态,并且可以输入的调试器命令。

    如果调试器已处于活动状态,中断不会影响目标应用程序。 但是,此命令可用于终止调试器命令。 例如,如果已请求很长并且不想看到的再中断将结束显示并使你返回到调试器命令提示符下。

    当您在执行使用 WinDbg 进行远程调试时,你可以主计算机的键盘上按 Break 键。 如果你想要发出从目标计算机的键盘中断,请在基于 x86 的计算机上使用 CTRL + C。

    可以按 F12 键以打开命令提示符下,当正在调试的应用程序繁忙时。 单击其中一个目标应用程序的 windows,在目标计算机上按 F12。


    内核模式的效果


    在内核模式下中断命令将导致目标计算机进入调试器。 此命令将锁定目标计算机并唤醒调试器。

    调试仍在运行的系统时,您必须按 Break 键主机键盘上打开初始的命令提示符。

    如果调试器已处于活动状态,中断不会影响目标计算机。 但是,此命令可用于终止调试器命令。 例如,如果已请求很长并且不想看到的再中断将结束显示并使你返回到调试器命令提示符下。

    此外可以使用中断若要打开命令提示符下,调试器命令生成很长或当目标计算机是繁忙时。 调试基于 x86 的计算机时,您还可以具有相同的效果目标键盘上按 CTRL + C。

    SYSRQ 密钥 (或增强型键盘上的按 ALT + SYSRQ) 是类似。 从任何处理器上的主机或目标键盘此密钥适用。 但是,此密钥仅适用于您通过按 CTRL + C 之前至少一次打开提示符。







    可以通过编辑注册表禁用 SYSRQ 密钥。 在 HKEY_本地_机\系统\CurrentControlSet\Services\i8042prt\参数注册表项,请创建一个名为值BreakOnSysRq并将其设置为等于 DWORD 0x0。 然后重启计算机。 在重新启动计算机后,可以将目标计算机的键盘上按 SYSRQ 密钥并不会中断内核调试程序。
  • 单步进入

    单击单步执行菜单以在目标上执行一条指令。 如果指令为函数调用,调试器将单步执行函数。此命令是等效于按 F11 或 F8 键或单击单步执行 (F11 或 F8) 按钮 (单步执行按钮的屏幕截图) 工具栏上。

  • 单步跳过

    单击单步跳过菜单以在目标上执行一条指令。 如果指令是函数调用,则执行整个函数。此命令相当于按 F10 或单击逐过程执行 (F10) 按钮 (的屏幕截图步骤按钮上方) 工具栏上。

  • 单步跳出

    单击单步跳出菜单以继续在目标系统上运行。 此命令执行当前函数的其余部分,并在完成返回的函数时中断。此命令相当于按 SHIFT + F11 或单击跳出 (Shift + F11) 按钮 (单步跳出按钮的屏幕截图) 工具栏上

  • 运行到光标处

    单击运行到光标处调试菜单以继续在目标系统上运行。 如果不插入中的指令上光标反汇编窗口或源窗口,然后执行此操作,WinDbg 从当前由指令指令执行的所有说明你已选择。此命令是等效于按 f7 键或 CTRL + F10 键或单击运行到光标处 (Ctrl + F10 或 F7) 按钮 (运行到光标按钮的屏幕截图) 工具栏上。

  • 源模式

    选择源模式菜单切换到源模式的调试器。 清除源模式以切换到程序集模式的调试器。可以单击上的源模式按钮 (在下图中左侧所示) 来更改调试器到源模式,或单击源模式关闭到按钮 (在下图右侧所示)将调试程序更改为程序集模式。源模式按钮的屏幕截图当源模式处于活动状态时,ASM 在状态栏上不可用。 在程序集模式处于活动状态,ASM 状态栏上显示。

  • 解决不符合要求的符号

    选择解析非限定符号上调试菜单用于解析不具有任何模块的前缀的符号。如果清除解析非限定符号,调试器无法解析不具有任何模块的前缀的符号。 如果不选择解析非限定符号和具有没有前缀的变量时未加载,调试器不会加载任何其他符号,若要解决此问题。 如果该选项是很清晰,但前提是它们已进行先前加载,仍可以使用非限定的符号。不过,我们始终建议你使用模块限定符,则可以清除解析非限定符号选项,以避免加载时不使用模块限定符解析不正确或者存在拼写错误的符号的符号。

  • 事件筛选器

    单击事件筛选器菜单打开事件筛选器对话框。

    在此对话框中,可以配置的中断状态和异常和事件的处理状态。事件筛选器对话框框中列出的调试器识别的所有事件。 您可以向将显示的列表添加带编号的异常。若要更改的事件的中断状态,请选择事件,然后单击之一执行选项按钮 (已启用,禁用,输出,或忽略)。若要更改的事件的处理状态,请选择该事件,然后单击之一继续选项按钮 (Handled或未处理)。若要添加新的带编号的异常,请单击添加。 当异常筛选器出现对话框,请输入异常代码,单击相应的按钮的中断状态和处理状态,然后单击确定。若要删除带编号的异常,请选择该异常,然后单击删除。 无法删除标准事件。如果设置的状态负载模块或卸载模块事件,可以限制此状态设置为特定模块。 单击自变量,输入模块的名称或中的模块的基址筛选器参数对话框中,然后单击确定。 可以使用通配符时指定的基址。 如果未指定模块,在加载或卸载的任何模块时,会发生中断。如果设置的状态调试对象输出事件,可以限制此状态设置为特定输出模式。 单击自变量,输入中的输出模式筛选器参数对话框中,然后单击确定。 如果未指定输出模式,在中断发生的任何输出。
    如果你想要设置自动事件进入调试器时就会执行的命令,选择事件,然后单击命令。 筛选器命令对话框将出现。 输入想要登录到任何命令命令或第二次命令框。 使用分号分隔多个命令,不要将这些命令括在引号中。

  • 模块

    单击模块菜单可显示的当前列表加载的模块。当您单击模块,则模块列表对话框随即出现。

    此对话框列出了当前加载到内存中的所有模块。

    模块列表分为以下各列:


    • 名称列指定的模块名称。

    • 启动最终列指定模块的内存中的映像的第一个和最后一个地址。

    • 时间戳列指定的生成日期和时间的模块。

    • 校验和列指定的校验和值。

    • 符号列将显示此模块使用的符号信息。 此列中显示的值的详细信息,请参阅符号状态缩写。

    • 符号文件列指定关联的符号文件的路径和文件。 如果调试器不知道的任何符号文件,而是提供可执行文件的名称。


    如果单击某一列的标题栏,显示将按该列中数据进行排序。 如果单击标题栏中再次,反转排序顺序。如果您选择某一行,然后单击重新加载,将重新加载模块的符号信息。如果选择一个行,按 CTRL + C,整行复制到剪贴板。单击关闭以关闭此对话框。

  • 内核连接---循环波特率

    指向内核连接,然后单击周期波特率菜单来更改在内核调试连接中使用的波特率。此命令相当于按 CTRL + ALT + A。 (您可以还按 CTRL + A 中 KD。)此命令进行循环的内核调试连接的所有可用波特率。 受支持的波特率有 19200、 38400、 57600 和 115200。 使用此命令中,每次选择下一步的波特率。 如果已经是 115200 波特率,则将其减少到 19200。此命令不能用于更改在其中进行调试的波特率。 在主计算机和目标计算机的波特率必须匹配,并且不能无需重新启动计算机更改的目标计算机的波特率。 因此,两台计算机尝试以不同速率进行通信时,才必须更改的波特率。 在这种情况下,必须更改主计算机的波特率以匹配的目标计算机。

  • 内核连接---循环初始中断

    指向内核连接,然后单击周期初始中断菜单来更改在其,调试器将自动中断到目标的条件计算机。此命令相当于按下 CTRL + ALT + K。 (您可以同时按 CTRL + K KD 中。)此命令会使内核调试程序,以下三种状态之间循环:

    无分隔符
    到目标计算机不会中断调试器,除非你按CTRL + BREAK或调试 |中断。

    在重新启动时中断
    内核初始化后,调试器将中断重启的目标计算机。 此命令相当于使用-b 启动 WinDbg 命令行选项。

    第一个模块加载时中断
    第一个内核模块加载之后,调试器将中断重启的目标计算机。 (此操作会导致要比前面上重新启动中断状态。)此命令相当于使用-d 启动 WinDbg 命令行选项。





    当你使用周期初始中断命令时,显示新的中断状态。
  • 内核连接---重新同步

    指向内核连接,然后单击重新同步菜单会导致调试器尝试重新建立内核调试与目标的连接计算机。此命令相当于按下 CTRL + ALT + R。 (您还可以按 CTRL + R 中 KD。)如果目标没有响应,请使用此命令。

1.5、窗口菜单

 主要是对Windbg窗口布局的一些功能。

  • 关闭所有源窗口
    单击关闭所有源 窗口菜单关闭所有窗口
  • 关闭所有错误窗口
    单击关闭所有错误 窗口菜单关闭已经从找不到源文件中打开的所有错误消息框。
  • 打开停靠窗口
    单击打开停靠窗口菜单以创建新的停靠。 一个停靠是可以将调试信息 windows 到独立窗口。
  • 全部停靠

    单击所有停靠浮动窗口中,除之外使用的所有始终浮点它们的快捷菜单上选择。WinDbg 自动定位每个浮动窗口。 如果永远不会具有之前已停靠窗口,WinDbg 将其移到新的 untabbed 位置。 如果已在之前停靠窗口,WinDbg 将其移到其最近的停靠位置,这可能会将选项卡式或 untabbed。

  • 取消所有停靠

    单击取消停靠所有窗口菜单可将所有停靠窗口更改为浮动窗口。WinDbg 返回到它所占据的最后一个时间,它是浮动窗口的位置的每个停靠的窗口

  • MDI模拟

    选择MDI 仿真菜单使 WinDbg 来模拟窗口化的多文档界面 (MDI) 样式。 这种类型的窗口化不同于停靠模式,因为所有窗口都浮动,但在框架窗口内限制都浮动窗口。 引入了停靠模式之前,此行为来模拟 WinDbg 的行为。清除MDI 仿真上窗口菜单 WinDbg 回到停靠模式。

  • 自动打开反汇编窗口

    选择会自动打开反汇编菜单可导致反汇编窗口打开每次 WinDbg 开始调试会话。如果清除此命令,仍可以通过单击打开反汇编窗口反汇编上视图菜单中,按 ALT + 7,或单击反汇编 (Alt + F7) 按钮 (反汇编按钮的屏幕截图) 工具栏上。

1.6、帮助菜单

此部分将介绍以下命令帮助WinDbg 菜单:

  • 内容

    单击内容菜单打开内容此帮助文档中的选项卡。此命令相当于按下 f1 键。

  • 索引
    单击索引菜单打开索引此帮助文档中的选项卡。
  • 搜索
    单击搜索菜单打开搜索此帮助文档中的选项卡。
  • 关于

    单击有关菜单以打开一个消息框,显示了正在使用的 WinDbg 二进制文件的版本信息。单击确定以关闭此消息框。

 

二、工具栏

除了断点按钮在工具栏上的每个按钮相当于菜单命令。 每个按钮的效果的完整说明,请参阅相应的菜单命令的页。

在工具栏上的按钮具有以下效果。

按钮描述
Screen shot of the Open Source File button

打开源文件为只读的文件。 等效于文件 |打开源文件。

Screen shot of the Cut button

从活动窗口中删除所选的文本并将其放到剪贴板上。 等效于编辑 |剪切。

Screen shot of the Copy button

将所选的文本从活动窗口复制到剪贴板。 等效于编辑 |复制。

Screen shot of the Paste button

将文本粘贴到光标所在的位置在剪贴板上。 等效于编辑 |粘贴。

Screen shot of the Go button

启动或恢复执行。 执行将继续到达到断点、 异常或事件发生时,该过程结束或调试器将中断目标。 等效于调试 |转。

Screen shot of the Restart button

重新启动进程的开始处的执行。 等效于调试 |重新启动。

Screen shot of the Stop Debugging button

停止执行并永久终止目标进程。 等效于调试 |停止调试。

Screen shot of the Break button

在用户模式下,此按钮停止进程和线程。 在内核模式下,此按钮将分成在目标计算机。 控制权返回给调试器。 此按钮也是用于长时间切断调试器命令窗口显示。 等效于调试 |中断。

Screen shot of the Step Into button

执行一条指令。 如果指令为函数调用,调试器将单步执行函数。 等效于调试 |单步执行。

Screen shot of the Step Over button

执行一条指令。 如果指令是函数调用,调试器将在一个步骤中执行整个函数。 等效于调试 |逐过程执行。

Screen shot of the Step Out button

执行当前函数的其余部分,并完成函数返回时中断。 等效于调试 |跳出。

Screen shot of the Run to Cursor button

从当前到标记为活动反汇编窗口或源窗口中的指令指令执行的所有说明。 等效于调试 |运行到光标处。

Screen shot of the Breakpoints button

如果活动窗口的源或反汇编窗口:在当前行中插入断点。 (如果已没有当前行上设置断点,此按钮将移除该断点。)

否则为:此时将打开断点像那样的对话框编辑 |断点。

Screen shot of the Command button

打开或激活调试器命令窗口。 等效于视图 |命令。

Screen shot of the Watch button

打开或激活监视窗口。 等效于视图 |观看。

Screen shot of the Locals button

打开或激活局部变量窗口。 等效于视图 |局部变量。

Screen shot of the Registers button

打开或激活寄存器窗口。 等效于视图 |注册。

Screen shot of the Memory button

打开一个新的内存窗口。 等效于视图 |内存。

Screen shot of the Call Stack button

打开或激活调用窗口。 等效于视图 |调用堆栈。

Screen shot of the Disassembly button

打开或激活反汇编窗口。 等效于视图 |反汇编。

Screen shot of the Scratch Pad button

打开或激活暂存器。 等效于视图 |草稿板。

Screen shot of the Source Mode button

源模式和调试程序集模式之间切换。 等效于选中或清除调试 |源模式。

Screen shot of the Font button

可以更改在调试的信息窗口中使用的字体。 等效于视图 |字体。

Screen shot of the Options button

显示选项对话框。 等效于视图 |选项。

三、快捷键

可以使用以下键盘快捷方式窗口之间进行切换。 有关如何在窗口之间移动的详细信息,请参阅定位 Windows。

效果

CTRL+TAB

调试信息窗口之间切换。 通过重复使用此密钥,你可以扫描通过的所有窗口,而不考虑是否浮动、 停靠本身,或选项卡式停靠窗口的集合的一部分。

Alt+Tab

目前,在您的桌面上的窗口之间切换。 此外可以使用此键盘快捷方式的 WinDbg 帧和已创建任何其他停靠之间进行切换。

一、什么是工作空间

Windbg把和调试相关的所有配置称为workspaceWinDbg使用工作空间来描述和存储调试项目的属性、参数及调试器设置等信息。工作空间与vc中的项目文件很相似。退出windbg时,它会将会话配置保存在工作区中。工作区使您能够轻松地保留从一个会话到另一个会话的设置。您还可以手动保存或清除工作区,甚至可以使用工作区保存仍在进行中的调试会话。

二、工作空间保存的信息

 

WinDbg的工作空间中保存了一下信息:

  • 调试会话状态:包括,断点、打开的源文件、用户自定义别名。
  • 调试器设置:包括符号文件路径,可执行映像文件路径,源文件路径,用I+/I-命令设置的源文件选项,日志文件设置,通过启动内核调试对话框设置内核调试连接设置,最近一次打开文件对话框所使用的路径和输出设置等
  • WinDbg图形界面信息:包括WinDbg窗口标题、默认字体、是否自动打开反汇编窗口、窗口在桌面的位置、打开的子窗口、以及每个子窗口的状态等。

 

当您使用windbg作为调试客户机时,它的工作区只保存您通过图形界面设置的值。不会保存通过调试器命令窗口所做的更改。(此限制保证只反映本地客户端所做的更改,因为调试器命令窗口接受来自所有客户端和调试服务器的输入。

此外,断点信息保存在工作区中,包括断点地址和状态。会话结束时处于活动状态的断点在下一个会话启动时处于活动状态。但是,如果尚未加载适当的模块,那么其中一些断点可能无法解析。通过符号表达式、行号、数字地址或在源窗口中使用鼠标指定的断点都保存在工作区中。在反汇编或调用窗口中使用鼠标指定的断点不会保存在工作区中。 如果正在调试多个用户模式进程,则只保存与进程零关联的断点。

 

三、工作空间保存的位置

WinDbg默认使用注册表来保存工作空间设置,其路径为:HKEY_CURRENT_USER/Software/Microsoft/WinDBG/Workspaces,在此路径下有四个键:User、Kernel、Dump和Explicit。前三个键分别用来保存用户态调试、内核态调试、调试转储文件时使用的默认空间。Explicit用以存储命名的工作空间。在四个键下的每个键对应于一个工作空间。键值名为工作空间的名称,键值就是这个工作空间的配置数据。WinDbg支持使用文件来保存工作空间。这可以使用菜单Save workspace to File。使用Delete workSpaces可以删除工作空间。更快的方法是直接删除保存在注册表中的键值。

 

四、工作空间分类

WinDbg定义了两种工作空间,一种为默认工作空间,另一种为命名的工作空间。当没有明确使用某个命名空间时,WinDbg总是使用默认工作空间。

  • 默认工作空间
    windbg自己预先创建的一系列的空间
  • 命名空间
    可以把你的配置保存为一个命名的workspace保存在注册表中,并且在需要的时候应用它。Windbg软件本身也会根据你所调试的可执行程序或dump文件,自动保存为命名workspace。这就是为什么你调试了一次HelloWorld程序后,下次再次调试的时候,Windbg会自动打开很多相关的源文件,并自动加载符号的原因。

五、WinDbg的默认工作空间

WinDbg在安装后就有预先创建了一些列默认空间。分别为基础工作空间、默认内核工作空间、默认远程调试工作空间、特定处理器工作空间、默认用户态工作空间。它们分别定义了在WinDbg在各种条件下的一些配置、参数设置等。

  • 基础工作空间:当调试会话尚未建立,WinDbg处于闲置状态时,会使用此空间作为默认空间。
  • 默认内核工作空间:当WinDbg开始内核调试,但是尚未与调试目标建立连接时,会使用此空间作为默认空间。
  • 默认远程调试工作空间:当通过调试服务器进行远程调试时,会使用此空间作为默认空间。
  • 默认的用户态工作空间:当使用WinDbg调试一个已运行的进程时,会使用这个空间作为默认工作空间。
  • 特定处理器工作空间:在windbg连接到目标计算机之后,在内核模式调试期间使用特定于处理器的工作区。对于基于x86和基于x64的处理器,有单独的特定于处理器的工作区。

当WinDbg打开一个应用程序开始调试时,调试器会 根据可执行文件的路径和文件名为其创建一个默认工作空间,如果已经存在工作空间,就使用已存在的。在WinDbg的文件菜单中可以使用另存为..创建一个命名的工作空间。

六、工作空间的创建和加载

当windbg创建用于调试的用户模式进程时,将为该可执行文件创建一个工作区。每个创建的可执行文件都有自己的工作区。当windbg分析转储文件时,将为该转储文件分析会话创建一个工作区。每个转储文件都有自己的工作区。开始调试会话时,将加载相应的工作区。结束调试会话或退出windbg时,将显示一个对话框,询问您是否要保存对当前工作区所做的更改。如果使用-qycommand line选项启动windbg,则不会显示此对话框,工作空间将自动保存。此外,如果使用-q命令行选项启动windbg,则不会显示此对话框,也不会保存任何更改。

工作区以累积方式加载。基本工作区始终首先加载。开始特定调试操作时,将加载相应的工作区。因此,大多数调试是在加载两个工作区之后完成的。内核模式调试在加载了三个工作区(基本工作区、默认内核模式工作区和特定于处理器的工作区)之后完成。

 

注意:调试信息窗口的布局是工作区累积行为的一个例外。每个窗口的位置、停靠状态和大小仅由您打开的最新工作区决定。此行为包括监视窗口的内容和在每个内存窗口中查看的位置。打开新工作区时,不会清除调试器命令窗口中的命令历史记录,但会重置所有其他窗口状态。 

主题是预配置的windbg工作区,其中包含调试信息窗口的有用配置。任何主题都可以保存为基本工作区。Windows调试工具包中的主题作为一组注册表文件(扩展名为.reg)提供。当您积累更多的调试会话时,会自动设置各种默认工作区。这些默认工作区使用基本工作区作为起点。有关默认工作区的详细信息,请参见WinDbg的工作空间---Work Space

安装Windows调试工具时,您将同时获得32位工具集和64位工具集。如下图

如果使用的是Microsoft Visual Studio调试环境,则无需考虑是否使用32位或64位,因为Visual Studio会自动选择正确的调试工具。如果您使用的是其他调试环境(windbg、kd、cdb或ntsd),则必须自己做出选择。

运行调试器的计算机称为主机,。

一、相关概念

  • 调试主机 (Host computer)
    在调试环境下,运行调试器(比如Windbg)的计算机称为主机。
  • 调试目标机(Target computer)
    被调试的计算机称为目标计算机

二、选择标准

选择标准就是以主机和目标机以及调试对象来划分的。要确定要使用的调试工具集,您需要知道主机上运行的处理器类型以及主机运行的是32位还是64位版本的Windows。

2.1、当主机为32位机时
也就是说主机是32位的cpu且是32位的Windows系统时,请使用32位调试工具。此情况适用于基于x86和基于x64的目标。

2.2、当主机位64机位时

如果主机使用基于x64的处理器,并且运行64位版本的Windows,则应用以下规则:

  • 如果分析对象是转储文件,可以使用32位调试工具或64位调试工具。(转储文件是用户模式转储文件还是内核模式转储文件并不重要,转储文件是基于x86还是基于x64的平台生成也不重要。)
  • 如果正在执行实时内核模式调试,则可以使用32位调试工具或x64调试工具。(此情况适用于基于x86和基于x64的目标。)
  • 如果要调试与调试器在同一台计算机上运行的实时用户模式代码,请使用64位工具调试在WOW64上运行的64位代码和32位代码。要将调试器设置为32位或64位模式,请使用.effmach命令。
  • 如果要调试在单独目标计算机上运行的实时32位用户模式代码,请使用32位调试工具。

总之,只有在实时用户态调试,并且调试器也在同一台64位机器上的情况下必须用64位的调试工具集!