RtlCaptureStackBackTrace 函数 (ntifs.h)

RtlCaptureStackBackTrace 例程通过遍查堆栈并记录每个帧的信息来捕获堆栈跟踪。

语法

NTSYSAPI USHORT RtlCaptureStackBackTrace(
  [in]            ULONG  FramesToSkip,
  [in]            ULONG  FramesToCapture,
  [out]           PVOID  *BackTrace,
  [out, optional] PULONG BackTraceHash
);

参数

[in] FramesToSkip

要从后台跟踪的起始 (当前调用点) 跳过的帧数。

[in] FramesToCapture

要捕获的帧数。

[out] BackTrace

调用方分配的数组,其中返回指向从当前堆栈跟踪捕获的返回地址的指针。

[out, optional] BackTraceHash

可用于组织哈希表的可选值。 如果此参数为 NULL, 则 RtlCaptureStackBackTrace 不会计算并返回哈希值。

此哈希值是根据 BackTrace 数组中返回的指针的值计算的。 两个相同的堆栈跟踪将生成相同的哈希值。

返回值

捕获的帧数。

备注

RtlCaptureStackBackTrace 通过遍走堆栈 (在调用时间) 返回,并记录每个帧的信息来捕获调用方堆栈跟踪。 具体而言, RtlCaptureStackBackTrace 返回指向堆栈上每个调用的返回地址的指针,其中 BackTrace 数组中的第一个指针指向最近调用的返回地址,依此类推。

可以使用反向跟踪哈希值快速确定两个堆栈跟踪是相同还是不同。 可以使用 BackTraceHash 中返回的哈希来比较堆栈跟踪。 如果不想使用哈希,或者想要计算自己的哈希值,请将 BackTraceHash 设置为 NULL。

通常,在 64 位计算机上,当不允许页面错误时,你无法在某些上下文中捕获内核堆栈。 若要在 x64 上启用内核堆栈遍程,请将 DisablePagingExecutive 内存管理注册表值设置为 1。 DisablePagingExecutive 注册表值位于以下注册表项下:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management。 这只能用于临时诊断目的,因为它会增加系统的内存使用量。

要求

要求
最低受支持的客户端 Windows XP
目标平台 通用
标头 ntifs.h (包括 Ntifs.h、FltKernel.h)
Library NtosKrnl.lib;Windows 10 上的 OneCoreUAP.lib
DLL NtDll.dll (用户模式) ;NtosKrnl.exe (内核模式)