TTD 调用对象
说明
TTD 调用 对象用于提供有关在跟踪过程中发生的函数调用的信息。
参数
properties | 说明 |
---|---|
功能!SymbolName | 双引号中包含一个或多个,用逗号分隔。 例如 dx @$cursession。TTD。Calls(“module!symbol1”, “module!symbol2”, ...) |
属性
属性 | 说明 |
---|---|
EventType | 事件类型。 这是所有 TTD 调用对象的“调用”。 |
ThreadId | 发出请求的线程的 OS 线程 ID。 |
UniqueThreadId | 跟踪中线程的唯一 ID。 常规线程 ID 可以在进程的生存期内重复使用,但 UniqueThreadIds 无法重复使用。 |
函数 | 函数的符号名称。 |
FunctionAddress | 函数的内存中的地址。 |
返回值 | 函数的返回值。 如果函数具有 void 类型,则此属性将不存在。 |
Children
Object | 说明 |
---|---|
Parameters[] | 包含传递给函数的参数的数组。 元素数因函数的类型签名而异。 |
TimeStart | 一个 位置对象 ,描述调用开始时的位置。 |
TimeEnd | 描述 调用末尾位置的位置对象 。 |
注解
时间旅行调试使用 PDB 中提供的符号信息来确定函数及其类型、返回值类型和调用约定的参数数。 如果符号信息不可用或符号仅限于公共符号信息,仍可以执行查询。 时间旅行查询引擎将在此方案中做出一些假设:
- 函数有四个 64 位无符号整数参数
- 返回值为 64 位无符号整数
- 函数名称设置为固定字符串:“UnknownOrMissingSymbols”
这些假设允许在没有足够符号信息的情况下进行查询。 但是,为了获得最佳效果,请尽可能使用完整的 PDB 符号。
请注意,调用函数执行计算,并且根据跟踪的大小,可能需要一段时间才能运行。 CPU 使用率在计算期间将激增,并监视任务管理器中的 CPU 使用率,指示计算正在进行。 查询结果缓存在内存中,因此针对以前查询的调用的后续查询要快得多。
用法示例
此示例显示 ucrtbase!initterm 的调用对象。
0:000> dx -r2 @$cursession.TTD.Calls("ucrtbase!initterm")
@$cursession.TTD.Calls("ucrtbase!initterm")
[0x0]
EventType : Call
ThreadId : 0x2074
UniqueThreadId : 0x2
TimeStart : 1E:5D0
TimeEnd : 2D:E
Function : ucrtbase!_initterm
FunctionAddress : 0x7ffb345825d0
ReturnAddress : 0x7ff6a521677e
Parameters
SystemTimeStart : Friday, January 12, 2024 21:18:40.799
SystemTimeEnd : Friday, January 12, 2024 21:18:44.26