分类 调试 下的文章

!cppexr

简介

!cppexr显示C++异常记录的内容。

使用形式

!cppexrAddress

参数

  • Address
    指定要显示的C++异常记录的地址。

支持环境

Windows 2000

Ext .dll

Windows XP 和更高版本

Ext .dll

备注

! Cppexr扩展显示与目标遇到的C++异常有关的信息, 其中包括异常代码、异常的地址和异常标志。 此异常必须是 Msvcrt.lib 中定义的C++标准异常之一。

通常可以使用! 分析-v命令获取Address参数。! Cppexr扩展适用于确定C++异常类型。

 

编写C/C++代码时,通常使用复杂的代码行来处理多个指针,例如,在单个行上访问多个指针。然而,当访问冲突发生时,很难破译这行代码的哪一部分是问题所在。为了调试这个问题,您可能已经将这一行代码分解成多行,但不会再这样了。当使用Visual Studio 2015更新1时发生这种情况时,您可以很容易地看到导致此异常的指针。现在,我们在异常对话框中直接显示一条消息,通知您哪个变量是nullptr。

让我们来看下面的小C++代码示例。在本例中,我们有一系列类,每个类都包含指向另一个类的指针,以及一个名为GetHelloWorld()的函数。在main()方法中,我们取消引用所有指针,以便打印“Hello World”。

    int main()
    {
       ClassA* A = new ClassA();
       printf(A-> B-> C-> D-> GetHelloWorld());
       return 0;
    }

.load, .loadby (Load Extension DLL)

简介

.load和.loadby命令将新的扩展DLL加载到调试器中。

使用形式

.loadDLLName

!DLLName.load

.loadbyDLLName ModuleName

参数

  • DLLName

指定要加载的调试器扩展DLL。如果使用.load命令,DLLName应包含完整路径。如果使用.loadby命令,DLLName应仅包含文件名。

  • ModuleName

指定与DLL name指定的扩展DLL位于同一目录中的模块的模块名。

支持环境

模式

用户模式下,内核模式

目标

实时、 崩溃转储

平台

全部

备注

使用.load命令时,必须指定完整路径。
使用.loadby命令时,不指定路径。相反,调试器会找到ModuleName参数指定的模块,确定该模块的路径,然后在调试器加载扩展DLL时使用该路径。如果调试器找不到模块或找不到扩展DLL,则会收到指定问题的错误消息。指定的模块和扩展DLL之间不必有任何关系。因此,使用.loadby命令只是避免键入长路径的一种方法。

在.load或.loadby命令完成后,您可以访问存储在加载的扩展名中的命令。
要加载扩展DLL,可以执行以下操作之一:

  • 使用 .load.loadby命令。

  • 通过发出完整执行扩展 !DLLName.ExtensionCommand语法。 如果尚未加载调试器DLLName.dll,它此时加载的 DLL。

在Visual Studio 2015中,引入了新的异常设置窗口,该窗口提供了一种快速的方法,可以将调试器配置为在抛出异常时中断。作为窗口更新的一部分,仅仅按异常类型过滤并不总是足够好,您需要对调试器何时中断抛出的异常进行更细粒度的控制。因此,在Visual Studio 2017中,引入了一个新功能,允许您控制抛出异常时的中断,而不仅仅是类型。您可以将模块名条件添加到异常中,以便只在您关心的模块引发异常时中断。

概述-中断和抛出

实际情况是,您需要处理代码中的异常,以便在出现意外情况时应用程序能够正常降级,但作为开发人员,您仍然需要找出应用程序遇到这些意外情况的原因。因此,您希望在抛出异常时调试应用程序,而不必在代码中导航,以确定处理的是什么异常以及处理的位置。当调试涉及已处理异常的问题时,可以使用“异常设置”窗口告诉调试器在引发异常时中断。这允许您在处理异常之前在调试器下停止并检查异常。您可以对特定异常类型或整个异常类别执行此操作。

如果始终调试一个程序,并且将异常类别设置为在抛出时中断,则可以在程序执行过程中尽早捕获与异常相关的问题,这有助于确保以正确的方式处理每个异常。

!envvar

简介

!envvar扩展命令显示特定环境变量的值。

使用形式

!envvarVariable

参数

  •  Variable
    指定显示其值的环境变量。变量不区分大小写。