RtlCaptureStackBackTrace 未捕获任何帧

Posted

技术标签:

【中文标题】RtlCaptureStackBackTrace 未捕获任何帧【英文标题】:RtlCaptureStackBackTrace is capturing no frame 【发布时间】:2020-02-20 10:23:22 【问题描述】:

我在内核模式驱动程序中使用 RtlCaptureStackBackTrace 并尝试获取调用跟踪,但它正在捕获零帧。代码是:

PVOID *stackTrace = NULL;
PULONG traceHash = NULL;
USHORT capturedFrames = 0;

capturedFrames = RtlCaptureStackBackTrace(0, 10, stackTrace, traceHash);

当我检查堆栈跟踪时,它是 NULL。

【问题讨论】:

格式化代码示例 【参考方案1】:

您提供stackTrace 作为NULL 但根据documentation:

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

这意味着你需要为BackTrace参数分配一个数组。

例如:

#define ARRAY_SIZE 10
PVOID stackTrace[ARRAY_SIZE] = 0;
USHORT capturedFrames = 0;

capturedFrames = RtlCaptureStackBackTrace(0, ARRAY_SIZE, stackTrace, NULL);

注意:不要在生产代码中使用,最好使用动态分配ExAllocatePoolWithTag())

也看看这个微软Sample

【讨论】:

哦!抱歉,我的错,我没注意到,这对我有用,谢谢,但现在唯一的问题是我想在内核中捕获近 5 到 6 条跟踪,就像我有 API1()->API2->... ->API6() 所以如果我从 API6() 遍历返回以获取 API1 地址,那么它应该给出,但它最多只能捕获 2 帧,内核中有没有更好的方法来捕获回溯?

以上是关于RtlCaptureStackBackTrace 未捕获任何帧的主要内容,如果未能解决你的问题,请参考以下文章