2023年1月

**“异常助手”**是一项用于调试 Visual Basic 和 C# 应用程序的功能。 **“异常助手”比其他语言(例如 C/C++)所使用的“异常”**对话框提供了更多有关异常的信息。这样便更易于查找异常原因并解决问题。

**“异常助手”**在发生运行时异常时出现,它显示异常的类型、故障排除提示以及纠正操作。 **“异常助手”**还可以用来查看异常对象的详细信息。异常是从 Exception 类继承的对象。 异常在出现问题时由代码引发,并在堆栈中向上传递,直到应用程序对其进行处理或者程序失败。

单击**“操作”窗格中的“查看详细信息”**。 即出现一个对话框,显示异常的属性。

下表列出并介绍了一个异常对象的属性。 并非所有属性都会出现,具体取决于异常的类型。

表 2

Property

说明

数据

包含用户定义的键/值对的 IDictionary 对象。 默认值为空集合。

FileName

导致异常的文件的名称。

FusionLog

描述程序集加载失败的原因的日志文件。

HelpLink

指向与异常相关联的帮助文件的链接。

HResult

赋给特定异常的编码数值。

InnerException

导致当前异常的 Exception 实例。 有时,在帮助器例程中捕获引发的异常,并引发对错误更具描述性的新异常,从而提供更多信息,这么做很有用。 在这种情况下,InnerException 属性将设置为原始异常。

Message

与异常相关联的消息。 消息以引发异常的线程的 CurrentUICulture 属性所指定的语言显示。

Source

导致异常的应用程序或对象的名称。 如果未设置 Source,将返回产生异常的程序集的名称。

StackTrace

引发当前异常时调用堆栈上的方法调用的字符串表示形式。 如果有可用的调试信息,则堆栈跟踪包含源文件名和程序行号。 由于优化期间发生代码转换,StackTrace 报告的方法调用可能没有预期的多。 堆栈跟踪被捕获后,将立即引发异常。

TargetSite

引发当前异常的方法。 如果引发异常的方法不可用并且堆栈跟踪不是空引用(Visual Basic 中的 Nothing),TargetSite 将从堆栈跟踪获取该方法。 如果堆栈跟踪为空引用,TargetSite 也返回空引用。

简介

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 文件的代码的更改。

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

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

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