|
今天忽然间对栈回溯产生了兴趣,因为有人说WIN64AST的的行为监视器看不到调用堆栈,于是打算实现相关功能。
无意中上网搜索关于栈回溯的知识,结果震惊了,这么标准的东西,竟然被那些所谓的“大牛”写得繁杂无比,还要内联汇编,还只支持STDCALL!
于是怀着“帮助后人”的想法,写下了这份简单的代码,通用于R3和R0,支持WIN32/WIN64,因为没有内嵌汇编和使用硬编码,相信能支持所有的架构,包括ARM、MIPS、IA64等。
- #include <stdio.h>
- #include <Windows.h>
- typedef ULONG (WINAPI *RTLWALKFRAMECHAIN)(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);
- RTLWALKFRAMECHAIN RtlWalkFrameChain=(RTLWALKFRAMECHAIN)GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"RtlWalkFrameChain");
- void PrintStack()
- {
- PVOID ary[MAX_PATH]={0}; //这里应该动态分配内存实现,直接用数组是偷懒的办法。
- ULONG StackCount;
- StackCount=RtlWalkFrameChain(ary,MAX_PATH,0);
- printf("\nStackCount=%ld\n",StackCount);
- for(ULONG i=0;i<StackCount;i++)
- printf("Stack[%d]=%p\n",i,ary[i]);
- DebugBreak();
- }
- void funD()
- {
- PrintStack();
- }
- void funC()
- {
- funD();
- }
- void funB()
- {
- funC();
- }
- void funA()
- {
- funB();
- }
- int main()
- {
- funA();
- getchar();
- return 0;
- }
复制代码
使用方法:
用WINDBG运行程序,按下F5,然后用WINDBG查看栈信息即可。
思考题:
为什么WINDBG里显示的数据和程序打印的数据有一个不同呢?
附件:
|
|