大佬教程收集整理的这篇文章主要介绍了arm – 如何解码Windows CE调用堆栈?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个类似的工具,但对于Windows CE. WinCE有一个函数来获取调用堆栈,GetThreadCallStack,但是一旦我有原始返回地址,我该怎么做
>确定每个程序计数器的模块(DLL或EXE)?
>使用我的.map或.pdb文件确定包含地址的函数?
Ps.如果它对任何人都有帮助,我还发现OS-agnostic code用于行走ARM调用栈.显然,可靠的确很难!
CallSnapshot frames[100]; HANDLE hThread = GetCurrentThread(); SetLastError(ERROR_succesS); int funcCount = GetThreadCallStack(hThread,100,frames,STACKSNAP_RETURN_FRAMES_ON_ERROR,0); bool success = GetLastError() == ERROR_succesS;
但由于某种原因,它的头文件不包含在Windows CE SDK中.因此,您需要手动声明它:
extern "C" { typedef struct _CallSnapshot { DWORD dwReturnAddr; } CallSnapshot; typedef struct _CallSnapshotEx { DWORD dwReturnAddr; DWORD dwFramePtr; DWORD dwCurProc; DWORD dwParams[4]; } CallSnapshotEx; ULONG GetThreadCallStack (HANDLE hThrd,ULONG dwMaxFrames,LPVOID lpFrames,DWORD dwFlags,DWORD dwSkip); ULONG GetCallStackSnapshot (ULONG dwMaxFrames,CallSnapshot lpFrames[],DWORD dwSkip); #define STACKSNAP_FAIL_IF_INCOMPLETE 1 #define STACKSNAP_EXTENDED_INFO 2 #define STACKSNAP_INPROC_ONLY 4 #define STACKSNAP_RETURN_FRAMES_ON_ERROR 8 }
然后解码调用堆栈,您必须(1)找出每个返回地址的模块(EXE或DLL),以及(2)找出该模块中的函数.
我问another question about getting the module from a code address;理论上,可以将地图文件解析为figure out which function (in that module) the address belongs to(感谢链接的ctackE).
以上是大佬教程为你收集整理的arm – 如何解码Windows CE调用堆栈?全部内容,希望文章能够帮你解决arm – 如何解码Windows CE调用堆栈?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。