今天稍微熟悉了一点汇编语法,并就一个案例试验了一下
VS里常见的汇编指令请见:https://blog.csdn.net/sinat_27382047/article/details/72810788
我就目前一个api做解释
CaptureStackBackTrace: 通过在堆栈上走动并记录每一帧的信息来捕获堆栈跟踪。
CaptureStackBackTrace的第一个参数:FramesToSkip => 从向后跟踪的开始要跳过的帧数
文档里面并没有说明这个参数的范围,其实这个参数范围是0-254,超过254将会返回0.
下面最小的一个例子:
#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); }
在 USHORT frameCount = CaptureStackBackTrace(255, USHRT_MAX, entireStack, NULL); 这行打断点
编译运行,并按Alt+8 快捷键,调出反汇编代码
可以看见汇编代码从CaptureStackBackTraces函数开始执行,接下来我按F11,在函数内运行,当运行到dword ptr这行时,我们会看到另外一个函数 -> RtlCaptureStackBackTrace,其实 CaptureStackBackTraces的内部是调用RtlCaptureStackBackTrace。
所以到继续F11,会跳到RtlCaptureStackBackTrace函数内部,见下图
注:cmp:比较大小指令,结果用来设置标志位。
我们可以看见cmp esi,0FEh esi是寄存器,里面用来存放数据,我们查看esi里面的数据是255(鼠标右键esi,选择QuickWatch),见下图
我们就可以看到当输入的参数超过254,返回值会为0
最终我们可以知道FramesToSkip的size最大不能超过254。
关于CaptureStackBackTrace的源代码可以参考:https://blog.csdn.net/pureman_mega/article/details/79006874