wenmo8 发布的文章

简介

STATUS_WX86_BREAKPOINT,值为0x4000001F,称为中断指令异常,表示在系统未附加内核调试器时遇到断点或断言。其定义如下:

/
// MessageId: STATUS_WX86_BREAKPOINT
//
// MessageText:
//
// Exception status code used by Win32 x86 emulation subsystem.
//
#define STATUS_WX86_BREAKPOINT           ((NTSTATUS)0x4000001FL)

说明

当断点(int 3)异常来自在WOW64模式下执行的代码(64位Windows中的32位代码)时,64位调试器确实获得了状态WX86。从64位代码中断点时-状态中断点。同样,在单步异常中,如果此异常来自64位代码,64位调试器将获得STATUS_single_step;如果异常来自WOW64代码,则获得STATUS_WX86_single_step。

可以像处理STATUS_BREAKPOINT(0x80000003)一样处理它。WX86提供了从哪个模式(WOW64或本机)中断的附加信息。但在这两种情况下,这都是断点异常。以及如何处理它的逻辑。但是,这是您的选择,决定如何处理断点、单步或其他异常。

还要注意,STATUS_WX86_BREAKPOINT和STATUS_WX86_SINGLE_STEP只得到64位调试器。32位调试器始终获取状态断点,64位调试器获取状态断点,而x64调试器获取状态断点时不获取任何信息。例如,在WOW64进程启动时-64位调试器获取了2个断点-第一个状态断点来自64位模式(在64位ntdll.LdrpDoDebugBreak中),然后是状态断点来自32位ntdll.LdrpDoDebugBreak。而32位调试器只有第二个断点(来自32位代码)具有状态断点。

异常结构填充

ExceptionAddress: 03264043 (libcef!GetHandleVerifier+0x00845ba3)
ExceptionCode: 4000001f (WOW64 breakpoint)
ExceptionFlags: 00000001
NumberParameters: 1
   Parameter[0]: 00000000

该属性页指定调试解决方案时调试器查找源文件的位置。

若要访问“调试源文件”属性页,右击“解决方案资源管理器”中的“解决方案”,并从快捷菜单中选择“属性”。 展开“通用属性”文件夹并单击“调试源文件”页。

  • 包含源代码的目录
    包含调试器在调试解决方案时搜索源文件的目录列表。 还可搜索指定目录的所有子目录。

  • 不查找下面这些源文件
    输入不希望调试器读取的任何文件的名称。 如果调试器在以上指定的某个目录中找到这些文件之一,它将忽略该文件。 如果在调试期间出现“查找源”对话框,这时您单击“取消”,那么,您搜索的文件将被添加到此列表中,以使调试器不再继续搜索该文件。

     

当处于调试状态时,"调试"--->"窗口"---->"模块"

右击**“模块”窗口并选择“符号加载信息”后,将打开“符号加载信息”**对话框。

  • 信息
    根据 Visual Studio 安装设置和在**“选项”**对话框中对符号设置所做的更改,显示搜索符号文件(PDB 文件)的目录。

  • 符号设置
    单击此按钮可更改在**“选项”对话框(“调试”类别,“符号”**页)中的符号设置。 在该页上,您可以添加或移除符号位置、指定本地缓存位置(如果使用符号服务器)并控制何时搜索符号位置。

     

     

     

“编辑并继续”处理大多数类型的代码更改。 但是,在程序执行期间,某些更改无法应用。 若要应用这些更改,必须停止执行并生成新版本的代码。

不支持的方案

在以下调试方案中,“编辑并继续”不可用:

  • 在 Windows 98 上调试。

  • 混合模式(本机/托管)调试。

  • SQL 调试。

  • 调试 Dr. Watson 转储。

  • 在未选择**“在未经处理的异常上展开调用堆栈”**选项的情况下,在发生未经处理的异常之后编辑代码。

  • 使用**“附加到”来调试应用程序,而不是单击“调试”菜单上的“开始”**来运行应用程序。

  • 调试优化后的代码。

  • 当目标为 64 位应用程序时,调试托管代码。 如果希望使用“编辑并继续”,必须将目标平台设置为 x86 (**“项目属性”对话框->“编译”选项卡->“高级编译器”**设置。)

  • 如果由于生成错误无法生成新版本的代码,则对旧版本的代码进行调试。

在调试会话期间不能应用的 C/C++ 更改

  • 大多数的全局或静态数据的更改。

  • 从其他计算机复制并且未在本地生成的可执行文件的更改。

  • 影响一个对象(如类的数据成员)布局的数据类型的更改。

  • 添加超过 64k 字节的新代码或数据。

  • 添加要求在指令指针前存在构造函数的变量。

  • 影响需要运行时初始化的代码的更改。

  • 在某些实例中,添加异常处理程序。

  • 资源文件的更改。

  • 只读文件中的代码更改。

  • 没有相应 PDB 文件的代码的更改。

  • 没有对象文件的代码的更改。

如果进行了上面某项更改,然后尝试应用代码更改,**“输出”**窗口中就会出现错误或警告信息。

  • “编辑并继续”不更新静态库。 如果您更改了静态库,仍会继续执行老版本,且不显示任何警告。

链接限制

“编辑并继续”有两种类型的链接器限制:

  • 默认情况下,“编辑并继续”在调试会话结束时重新链接到程序,以创建最新的可执行文件。 自动重新链接方面有一些限制。

  • 有些链接器选项禁用“编辑并继续”。

预编译头限制

默认情况下,“编辑并继续”在后台加载并处理预编译头,以加速对代码更改的处理。 加载预编译头需要分配物理内存,如果您正在一台 RAM 有限的计算机上进行编译,这可能会是一个问题。 在 Windows NT 或 Windows 2000 下,可以使用 Windows NT 任务管理器确定调试时可用的物理内存量,从而确定这是否会成为问题。 如果此数量大于预编译头的大小,则“编辑并继续”应没有问题。 如果此数量小于预编译头的大小,可以禁止“编辑并继续”在后台加载预编译头。

对“编辑并继续”禁用预编译头的后台加载

  1. 在“工具”菜单上,单击“选项”。

  2. 在“选项”对话框中选择“调试”节点,然后选择“编辑并继续”组。

  3. 清除“允许预编译”复选框。

  4. 单击“确定”。

特性限制

“编辑并继续”不重新生成接口定义 (IDL) 文件。 因此,调试时不反映对 IDL 特性的更改。 若要查看对 IDL 特性更改的结果,必须停止调试并重新生成应用程序。 如果 IDL 特性已更改,“编辑并继续”不生成错误或警告。