gpt4 book ai didi

使用 FramesToSkip CaptureStackBackTrace 不一致

转载 作者:行者123 更新时间:2023-11-30 16:18:38 25 4
gpt4 key购买 nike

在 Windows 上,您可以使用 CaptureStackBackTrace 捕获堆栈跟踪如

void* frames[USHRT_MAX];
USHORT framesCount = CaptureStackBackTrace(0, USHRT_MAX, frames, NULL);

但是,在循环中通过较小的 block 捕获它以避免分配 USHRT_MAX 缓冲区不会提供相同的结果。

这段代码

#include <Windows.h>
#include <assert.h>
#include <stdio.h>

__declspec(noinline) void CheckStack(void)
{
printf("Checking stack...\n");

void* entireStack[USHRT_MAX];
USHORT frameCount = CaptureStackBackTrace(0, USHRT_MAX, entireStack, NULL);

printf("Stack size is: %u\n", frameCount);

ULONG frameOffset = 1;

for (;;)
{
void* chunk[64];
USHORT framesFound = CaptureStackBackTrace(frameOffset, 64, chunk, NULL);
if (framesFound)
{
if (memcmp(entireStack + frameOffset, chunk, sizeof(chunk)) != 0)
{
printf("Incorrect content\n");
}

frameOffset += (ULONG)framesFound;
}
else
{
break;
}
}

if (frameCount != frameOffset)
{
printf("Incorrect count (%u != %u)\n", frameCount, frameOffset);
}

printf("Done\n");
}

__declspec(noinline) void Test(int i)
{
if (i != 500)
Test(++i);
else
CheckStack();
}

int main()
{
Test(0);
}

产生以下输出

Checking stack...
Stack size is: 507
Incorrect count (507 != 257)
Done

当构建为cl/Od main.c/link/OUT:main.exe时。

我是否错误地使用了 FramesToSkip 参数,或者为什么计数不相等?

最佳答案

如果您使用的是 Windows Server 2003 和 Windows XP,

The sum of the FramesToSkip and FramesToCapture parameters must be less than 63.

这在文档中。

另外,正如@RbMm所说,在API源码中,有以下逻辑:

if(FramesToSkip>0xfe)
{
return 0; //There are too many stack structures skipped, returning directly to 0.
}

但是,msdn 上的CaptureStackBackTrace 中都没有提到这一点。和 RtlCaptureStackBackTrace 。我不打算在这里发布源代码,而是在调试中证明它:

1.创建示例:

#include <Windows.h>
#include <assert.h>
#include <stdio.h>

__declspec(noinline) void CheckStack(void)
{
void* entireStack[USHRT_MAX];
USHORT frameCount = CaptureStackBackTrace(255, USHRT_MAX, entireStack, NULL);
}

__declspec(noinline) void Test(int i)
{
if (i != 500)
Test(++i);
else
CheckStack();
}

int main()
{
Test(0);
}

2.进入反汇编中的CaptureStackBackTrace: enter image description here可以看到dword ptr[ebp+8](入栈的CaptureStackBackTrace的第一个参数)将与0feh进行比较(254) 。如果为 true,则返回 0。

关于使用 FramesToSkip CaptureStackBackTrace 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55850603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com