Функция 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 Memory Management значение 1. Значение реестра DisablePagingExecutive находится в следующем разделе реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management. Это следует делать только для временной диагностики, так как это увеличивает использование памяти системой.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h, FltKernel.h) |
Библиотека | NtosKrnl.lib; OneCoreUAP.lib в Windows 10 |
DLL | NtDll.dll (пользовательский режим); NtosKrnl.exe (режим ядра) |