常见的表达式计算器功能
本主题介绍调试器中常见的各种表达式计算器功能,这些功能仅因语言不同而不同。
隐式变量
在 Visual Basic 和 C# 中,通过使用表达式计算器可以创建隐式变量。 这些隐式变量永远不会超出范围,可以作为任何其他变量一样处理。
在 C# 中,通过在表达式计算器中声明隐式变量可创建隐式变量。 例如,您可以在**“即时”**窗口中输入下列 C# 代码:
int b = 100;
在**“即时”窗口中执行此代码时,新的隐式变量将显示在“局部变量”**窗口中,其变量名称前有一个 $ 符号,在本例中,为 $b。
在 Visual Basic 中,不能在表达式计算器中声明隐式变量。 但是,如果在 Visual Basic 表达式计算器中使用未声明的变量,将会自动创建隐式变量。 在 Visual Basic 中,隐式变量不会列在**“局部变量”**窗口中。
断点
如果使用“即时”窗口计算包含断点的 Visual Basic 或 C# 方法或函数,将命中该断点并在**“调用堆栈”**上显示一个新框架。 下面是一个 C# 示例:
class Program
{
static void Main(string[] args)
{
// Breakpoint here:
int a = 20;
}
}
如果在注释指示的位置设置一个断点,然后按 F5 编译并执行该程序,将以常规方式命中该断点。 如果现在通过将 Program.Main(null) 键入**“即时”窗口来计算 Main 方法,该断点将再次被命中,“调用堆栈”**上将有一个该方法的项。
在“监视”窗口中计算
为避免出现不该有的副作用,调试器每次步进时都不会自动计算函数或方法。 相反,您可以通过一个图标来手动更新结果。 该图标显示在**“值”**列中。 这样就可以手动计算调用。 有关详细信息,请参阅副作用与表达式。
对象标识
此功能对 Visual Basic 不可用。
某些应用程序会创建一个类的许多实例。 在这些应用程序中,通过使用标识符来区分类的给定实例通常十分有用。 例如,如果类的特定实例的行为与预期不同或者已将特定实例多次插入应仅包含它一次的集合中,这么做就很有用。
本机对象标识
调试非托管代码时,可以通过地址来唯一地标识对象。 这么做很重要,原因有两点:
只需使用对象的地址即可跟踪对象。 这包括使用地址执行以下操作的能力:
查看位于该地址的对象的值。
检查是否相等。 通常情况下,您可以像使用对象变量本身那样使用对象的地址。
您可以使用对象(实例)的地址在该特定实例中的方法上设置断点。
例如,假定您有一个对象,它是 CMyType 类的实例,地址为 0xcccccccc。 您可以在该实例的 aMethod 方法上指定一个函数断点,如下所示:
((CMyType *) 0xcccccccc)->aMethod
托管对象标识
对于托管代码,不能使用对象的地址来标识该对象。 相反,需要使用由公共语言运行时 (CLR) 调试服务生成的并与该对象关联的整数(称为对象 ID)。 该数字是一个由 CLR 调试服务生成的正整数。 对象 ID 值除唯一地标识对象外,别无他用。
对象句柄显示为可变长度的十进制整数,数字后跟一个井号 (#),且不带任何前导零,例如 5#。 句柄显示在不同调试器数据窗口中的**“值”**列中。
若要为变量创建对象 ID,请右击该变量,然后选择**“创建对象 ID”。 调试器将显示一个后跟井号 (#) 的数字,如 123#。 若要删除对象 ID,请右击该变量,然后选择“删除对象 ID”**。
命中断点时,可以在**“监视”**窗口中键入变量的句柄。 调试器显示对象 ID 的值,您可以展开并检查它,就像对任何其他变量一样。
您可以使用对象 ID 在特定实例的方法上设置断点。 例如,假定您有一个对象,它是 CMyType 类的一个实例,该实例的对象 ID 为 5#。 类 CMyType 包含一个方法 aMethod。 您可以在实例 5# 的 aMethod 方法上设置一个函数断点,如下所示:
((CMyType) 5#).aMethod
还可以在断点条件中使用对象 ID。 下面的示例演示如何在条件中测试对象 ID。
this == 5#
请参见
概念
断点:使用命中次数、调用堆栈函数和条件在 Visual Studio 调试器中您所需的时间和位置进行中断