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)
NtosKrnl.lib;Windows 10 上的 OneCoreUAP.lib
DLL NtDll.dll(用户模式):NtosKrnl.exe(内核模式)