什么表情的跟踪点被允许?(What expressions are allowed in trace

2019-07-19 06:31发布

当创建在Visual Studio中的跟踪点(右键单击该断点,然后选择“当打......”),对话框中有这样的文字,重点煤矿:

可以通过将其放置在大括号中包括在所述消息中的变量或其他表达式的值...

什么表情被允许?

Answer 1:

微软的文档上的是什么,是不允许的具体细节,而稀疏。 大部分低于被立即窗口反复试验才发现。 请注意,这个列表是C ++,因为这是我的代码。我相信,在C#中,下面的一些违禁物品实际上是允许的。

最基本的表达式可以被评估,包括铸造,设置变量,并调用函数。

一般限制
  • 只有C-风格的转换支持; 没有的static_cast,dynamic_cast的,的reinterpret_cast,const_cast会
  • 不能宣布新的变量或创建对象
  • 不能使用重载运算符
  • 三元操作不起作用
  • 因为Visual Studio使用它不能用逗号格式化表达式的结果 ; 使用多组括号多个表情
函数调用
  • 禁止来电:
    • Lambda表达式(无法定义或给他们打电话)
    • 在一个匿名的命名空间功能
    • 通过价值取对象的函数(因为你无法创建对象)
  • 允许电话:
    • 会员功能,经常和虚拟
    • 功能服用引用或指针,要么根本的还是类类型
    • 传递范围变量
    • 使用“&”来传递指针的范围变量
    • 路过文字“真”,“假”,数字
    • 传递字符串文字,只要你不触犯运行“不能创建对象”规则
    • 通过使用多组括号中调用一个跟踪点多种功能
变量赋值
  • 禁止:
    • 对象
    • 字符串常量
  • 允许:
    • 与基本类型,无论是从文字或其他变量值的变量
    • 存储器地址,铸造后: { *(bool*)(0x1234) = true }
    • 寄存器: { @eip = 0x1234 }

用例

从调用函数跟踪点可以是相当强大的。 你可以避开最上面有精心设置的功能和正确的判罚中所列的限制。 这里有一些更具体的想法。

如果强制执行

很简单:建立一个跟踪点设置一个变量并强制如果条件为真或假,这取决于你需要测试的内容。 所有无需添加代码或离开调试会话。

断点“拨动”

我已经看到这个问题了几次,“我需要在被打了很多斑点,打破,我想简单地能够从另一个断点该断点,所以我关心的一个只对某个代码获取中断路径。我该怎么办呢?” 通过上面我们所知,这很容易,但你需要一个辅助变量。

  1. 创建一个全局布尔值,设置为false。
  2. 在您的最终目的地创建一个断点,有一个条件,打破只有当全局标志是真实的。
  3. 设置跟踪点在全局标志分配给真正的关键点。

这种做法的好处是,你可以四处移动跟踪点不留调试会话。 使用即时窗口或监视窗口重置全局标志,如果你需要做另一奔跑吧。 当你完成,你需要清理的是,全球布尔值。 没有其他的代码去除。

自动跳过代码

EIP寄存器(至少在x86)是指令指针。 如果分配给它,你可以改变你的程序流程。

  1. 找到您想一次打破它,看着EIP的值跳到该行的地址,无论是在寄存器窗口或“@ EIP,X”监视窗口。 (请注意,在寄存器窗口中的值是十六进制,但没有前导“0x”)。
  2. 添加跟踪点上要从跳过线,与像表达式{@eip = address} ,使用地址从第1步。
  3. 执行就行了任何事情之前 EIP分配将发生。

虽然这是很方便的,要小心,因为跳过这样的代码可能会导致怪异的行为。



Answer 2:

库尔特Hutchinson说,字符串赋值不是在跟踪点允许。 您可以通过创建一个将字符串变量的方法解决这个问题,并调用。

public static class Helper
{
    public static void AssignTo(this string value, out string variable)
    {
        variable = value;
    }
}

然后在您的跟踪点信息:

{"new string value".AssignTo(out stringVariable)}


文章来源: What expressions are allowed in tracepoints?