获取调用栈信息的函数RtlCaptureStackBackTrace()
2018-01-08 20:32
609 查看
这是一个导出函数,使用时必须试探页面产生异常的能力(probe the ability to take page fault)—(翻译 ddk文档)。
这个函数只是进行了参数的检查和信息的保存,实际工作有RtlWalkFrameChain()完成,下次再接着弄:)。
USHORT //返回捕捉到的结构数 RtlCaptureStackBackTrace( __in ULONG FramesToSkip, __in ULONG FramesToCapture, __out_ecount(FramesToCapture) PVOID *BackTrace, __out_opt PULONG BackTraceHash ) { int i=numOfTheLaskCapturedFrame=0;//额外的开销,程序编译过程中通过寄存器的合理搭配使用,这两个量就不用了;但是为了可读性加进来 if(FramesToCapture>0ffffh) //0xf jbe 0x15 超过最大捕捉量时,取设定的最大值 { FramesToCapture=0ffffh;//0x13 } if(FramesToSkip>0feh) //0x15 jbe 0x24 { return 0; //0x20 跳过的栈结构太多,直接返回0 } else { numOfTheLastCapturedFrame=RtlWalkFrameChain( BackTrace,//保存栈结构信息 FramesToSkip+FramesToCapture+1,//结束的下标 (FramesToSkip+1)<<8)) // 开始的下标 //0x24 jbe 0x69 if((FramesToSkip+1)>numOfTheLastCapturedFrame) { return 0; } else { if(BackTraceHash) //0x3f je 0x65 { if(FramesToCapture<=0) //0x46 jbe 0x5e { *BackTraceHash=0; //0x5e return 0; } else { for(i;FramesToSkip+i<numOfTheLastCapturedFrame,i<FramesToCapture;i++) //0x4b { *BackTraceHash+=BackTrace[i]; //0x52 //0x5e 将栈结构地址加在一起作为hash值 return i+1; } } } else { return numOfTheLastCaputredFrame-FramesToSkip-1; } } } }
这个函数只是进行了参数的检查和信息的保存,实际工作有RtlWalkFrameChain()完成,下次再接着弄:)。
相关文章推荐
- linux下打印函数调用栈(stack backtrace in Linux)
- linux下打印函数调用栈(stack backtrace in Linux)
- Java高级--Java线程运行栈信息的获取 getStackTrace()
- 通过StackTraceElement获取方法调用者的具体信息
- python获取调用栈中的函数信息
- java 获取e.printStackTrace() 的具体信息,赋值给String 变量 并返回
- 重构获取异常栈信息--printStackTrace
- StackTraceElement获取方法调用栈信息实例详解
- StackTraceElement获取方法调用栈的信息
- 通过StackTraceElement获取方法调用者的具体信息
- 如何获取e.printStackTrace()的内容
- PHP 获取图像信息 getimagesize 函数
- C++ 获取当前正在执行的函数的相关信息
- delphi获取Exe文件版本信息的函数[转]
- 使用日志框架如何输出printStackTrace()的堆栈信息
- 获取SpringMVC所有的rest接口及其对应函数信息
- 《ASCE1885的网络编程》---Winsock APIの网络信息获取函数
- 获取文件的属性信息及其操作函数
- C++ 获取当前正在执行的函数的相关信息
- python好东西——使用inspect.stack() 获取调用栈