arm – 如何解码Windows CE调用堆栈?
发布时间:2020-12-14 02:07:26 所属栏目:Windows 来源:网络整理
导读:桌面 Windows操作系统具有“StackWalk64”功能,Jochen Kalmbach将 a library for decoding the call stack变为人类可读的东西. 我需要一个类似的工具,但对于Windows CE. WinCE有一个函数来获取调用堆栈,GetThreadCallStack,但是一旦我有原始返回地址,我该怎
桌面
Windows操作系统具有“StackWalk64”功能,Jochen Kalmbach将
a library for decoding the call stack变为人类可读的东西.
我需要一个类似的工具,但对于Windows CE. WinCE有一个函数来获取调用堆栈,GetThreadCallStack,但是一旦我有原始返回地址,我该怎么做 >确定每个程序计数器的模块(DLL或EXE)? PS.如果它对任何人都有帮助,我还发现OS-agnostic code用于行走ARM调用栈.显然,可靠的确很难! 解决方法
好吧,我想出了一半.你需要调用GetThreadCallStack …
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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 是否可以为Windows为管理员用户创建的标准用户令牌添加权限
- Windows环境下安装MySQL5.7及MySQL WrokBench
- windows – 你如何释放被死进程打开的端口?
- 在Windows 7上编辑IDLE(Python GUI)上下文菜单
- 用于Windows 10的wget.exe
- Windows 7 SDK for .NET 4.5?
- wcf – Windows Phone 7.1上的NetTcpBinding(芒果)
- window.open()打开子页面并从父页面取值
- 在Windows上,OpenGL与DirectX有何不同?
- WP7(Windows Phone 7)在XAML或C#中锁定手机方向