wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了arm – 如何解码Windows CE调用堆栈?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

桌面 Windows操作系统具有“StackWalk64”功能,Jochen KalmBACh将 a library for decoding the call stack变为人类可读的东西. 我需要一个类似的工具,但对于Windows CE. WinCE有一个函数来获取调用堆栈,GetThreadCallStack,但是一旦我有原始返回地址,我该怎么做 >确定每个程序计数器的模块(DLL或EXE
@H_673_18@ 桌面 Windows操作系统具有“StackWalk64”功能,Jochen KalmBACh将 @L_403_1@变为人类可读的东西.

我需要一个类似的工具,但对于Windows CE. WinCE有一个函数获取调用堆栈,GetThreadCallStack,但是一旦我有原始返回地址,我该怎么做

>确定每个程序计数器的模块(DLL或EXE)
>使用我的.map或.pdb文件确定包含地址的函数

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).

大佬总结

以上是大佬教程为你收集整理的arm – 如何解码Windows CE调用堆栈?全部内容,希望文章能够帮你解决arm – 如何解码Windows CE调用堆栈?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。