分类 调试 下的文章

简介

KiUserExceptionDispatcher 是SEH分发器的用户模式的负责函数。当一个异常发生的时候,该异常将生成一个异常事件,内核检查该异常是否是由于执行用户模式代码导致的。如果是这样的话,内核修改栈上的trap frame,因此当内核从中断或者异常返回的时候,线程将从KiUserExceptionDispatcher 函数执行而不是导致异常的指令。内核将另外安排几个参数(一个 PCONTEXT 和一个 PEXCEPTION_RECORD),它们描述了异常发生时机器的状态,而且在线程返回到用户模式之前被传递给KiUserExceptionDispatcher 函数。
一旦内核模式栈展开,而且指令转移到用户模式的KiUserExceptionDispatcher
函数,该函数通过调用一个本地的函数RtlDispatchException来处理异常,RtlDispatchException是用户模式异常处理逻辑中的核心函数。如果异常被成功分发的话(也就是SHE
链表中有一个函数宣称可以处理该异常), RtlDispatchException调用RtlRestoreContext
函数实现最终的用户模式上下文的设置,该函数只是加载给定的上下文中的寄存器到到处理器的体系结构执行状态中。 否则,通过调用 NtRaiseException
函数,异常重新被提交到内核模式,这是最后一次机会了。在内核停止该进程之前,这给了用户模式调试器(如果有的话)一个处理该异常的最后机会。
(内核内部在安排KiUserExceptionDispatcher执行之前给了用户模式调试器和内核模式调试器第一次处理该异常的机会)

原型和伪码

改函数位于模块ntdll.dll,声明如下:

VOID KiUserExceptionDispatcher(__in PEXCEPTION_RECORD ExceptionRecord,__in PCONTEXT ContextRecord)

使用 Visual Studio,您可以调试运行在本地计算机或远程计算机上的 64 位应用程序。如果进行本地调试,Visual Studio在 WOW64 下运行,WOW64 是允许 32 位 Windows 应用程序在 64 位 Windows 上运行的 32 位 x86 仿真程序。 只在 x64 上支持 WOW64 下的本地调试。

如果进行远程调试,Visual Studio 可以在 WOW64 下或 32 位计算机上运行。 除了可以调试在 x64 WOW 模式下或在 32 位操作系统上运行的 32 位应用程序之外,您还可以调试 IA64 和 x64 应用程序。

若要调试在远程计算机上运行的 64 位应用程序,需要在远程计算机上安装 64 位远程调试器。 64 位远程调试器可以从 Visual Studio 安装套件的最后一张光盘获得。

如果在本地计算机上调试 64 位应用程序,Visual Studio 将使用远程调试以连接同一台计算机上的 WOW64 和 64 位应用程序。 在计算机上安装 Visual Studio 时,将自动安装远程调试组件。

不管哪种情况,在 64 位计算机上安装远程调试会同时安装 32 位和 64 位版本的远程调试监视器。 若要调试 64 位应用程序,必须使用正确的版本,它是在“开始”菜单上的“远程调试器 (x64)”。调试 64 位代码几乎与调试 32 位代码一样。 其中一个区别是,“编辑并继续”对 64 位代码不可用。

如果托管代码使用 Microsoft .NET Framework 版本 4 或更高版本,则 x64 进程支持混合模式调试(从本机代码到托管代码的调用,反之亦然)。使用低于 4 的 .NET Framework 版本的 IA64 进程或 x64 进程不支持混合模式调试。

启动 64 位远程调试监视器

  1. 单击**“开始”,依次指向“所有程序”、“Microsoft Visual Studio ”、“Visual Studio 工具”,再单击“远程调试器(x64)”或“远程调试器(IA64)”**。

    - 或 -

    从 Windows“命令提示符”运行 Install path\Microsoft Visual Studio\Common7\IDE\Remote Debugger\x64 或 Install path\Microsoft Visual Studio\Common7\IDE\Remote Debugger\ia64。

  2. 为远程调试配置“远程调试监视器”。


    • 若要在“Windows 身份验证模式”中设置远程调试。

    • 若要在“无身份验证模式”中设置远程调试(仅限本机代码)。 “无身份验证模式”可以在慢速网络上实现较快调试,但它是不安全的,只应在安全网络中使用。

生成 64 位应用程序的转储文件

Visual Studio 允许您调试 64 位应用程序的转储文件。 调试 64 位转储文件要求能够在本地或远程访问 64 位计算机。下面的过程解释如何为 64 位应用程序生成转储文件。 调试 64 位转储文件的操作必须在 64 位计算机上执行。

转储文件可能很大,特别是在将转储文件保存为**“附带堆信息的小型转储”时。 如果将转储文件保存为不附带堆信息的“小型转储”,将生成较小的文件。 如果不附带堆信息,则 Visual Studio  无法加载符号并进行调试,除非它能够访问二进制文件。

  1. 在“调试”菜单上,单击“附加到进程”。

  2. 在“附加到进程”对话框中,选择运行 64 位应用程序的远程计算机,并选择对应于应用程序的进程。

  3. 单击“确定”。

  4. 在“调试”菜单上,单击“中断”以中断 64 位进程。

  5. 在“调试”菜单上,单击“将转储另存为”。

  6. 在“将转储另存为”对话框中的“保存类型”列表中,单击“小型转储”或“附带堆信息的小型转储”。

  7. 使用导航控件选择保存位置。

    此位置将在远程计算机上,路径与在远程计算机上显示的相同。

  8. 单击“保存”。

安装 Visual Studio 时,系统会要求您为主要的编程语言选择一组默认的 IDE 设置。 某些语言的默认 IDE 设置可能会隐藏某些调试器命令。如果要使用由默认 IDE 设置隐藏的调试器功能,可以使用以下过程将相应的命令重新添加到菜单中。

还原隐藏的调试器命令

  1. 在项目处于打开的状态下,在“工具”菜单上单击“自定义”。

  2. 在“自定义”对话框中,单击“命令”选项卡。

  3. 在“菜单”框中,选择“调试”。

  4. 在“命令”框中,选择要添加的命令,并将其拖动到“调试”菜单。

  5. 重复上面的步骤以添加其他命令。

  6. 完成将命令添加到菜单后,单击“关闭”。

    某些菜单项仅在调试器处于特定模式(如运行模式或中断模式)下才显示。 因此,在完成这些步骤后,您所添加的项可能不会立即显示出来。

还原“自定义”对话框中不可用的命令

某些命令(特别是分层菜单中的命令)无法从“自定义”对话框中还原。 要还原这些命令,必须导入一组新的 IDE 设置。

导入新的 IDE 设置

  1. 在“工具”菜单上,单击“导入和导出设置”。

  2. 在“欢迎使用‘导入和导出设置向导’”页面上,单击“导入选定的环境设置”,然后单击“下一步”。

  3. 在“保存当前设置”页面上,确定是否保存现有的设置,然后单击“下一步”。

  4. 在“选择要导入的设置集合”页面上的“默认设置”文件夹下,选择一个包含要使用的命令的开发设置集合。 如果不知道应选择哪个集合,请尝试“常规开发设置”或“Visual C++ 开发设置”,这两个集合提供了大部分的调试器命令。

  5. 单击“下一步”。

  6. 在“选择要导入的设置”页面上的“选项”下,确保选中了“调试”。 清除其他复选框,除非还要导入这些复选框对应的设置。

  7. 单击“完成”。

  8. 在“导入完成”页面上,检查“详细信息”部分,查看是否有任何与重置您的设置相关联的错误。

  9. 单击“关闭”。