加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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)?
>使用我的.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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读