我试图遍历调用栈帧并从中提取一些信息。我能够使用StackWalk64、SymGetSymFromAddr64和SymGetLineFromAddr64 API从WinDBG提取文件名、行号和函数名。
但是,STACKFRAME64中的DWORD64 Params[4] (来自StackWalk64的返回值)仅支持从帧中读回四个64位函数参数。更糟糕的是,在32位系统上,只使用Params[4]的低32位,因此超过32位的单个参数需要两个或更多元素。
typedef struct _tagSTACKFRAME64 {
ADDRESS64 AddrPC;
ADDRESS64 AddrReturn;
ADDRESS64 AddrFrame;
ADDRESS64 AddrStack;
ADDRESS64 AddrBStore;
PVOID FuncTableEntry;
DWORD64 Params[4];
BOOL Far;
BOOL Virtual;
DWORD64 Reserved[3];
KDHELP64 KdHelp;
} STACKFRAME64, *LPSTACKFRAME64;我找不到任何API来无限制地读取堆栈帧中的所有参数。
我在考虑使用ebp/rbp从堆栈(x86/x64)和寄存器(x64)中提取值。但是,如果我这样做,仍然只能获得参数的“可能”值。
有没有什么API可以让我获得准确的值?如果我能得到参数的类型和名称,那就更好了。
发布于 2014-05-02 20:43:15
没有用于它的API。为什么要有现代的OSes对一些人玩这些东西不感兴趣。如前所述,编译器可以自由地进行优化,因此您不能使用任何确定性工具来进行优化。但是,有启发式方法!如果你在调用之前解析汇编或者在调用之后解析ret,你可以知道函数中有多少参数,你总是有返回地址,你可以检查它是否在CS中。
最重要的是-你应该阅读术语“堆栈展开”。
https://stackoverflow.com/questions/23144389
复制相似问题