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 未捕获任何帧的主要内容,如果未能解决你的问题,请参考以下文章