Я пытался пройтись по фреймам стека вызовов и извлечь из них некоторую информацию. Я могу извлекать имена файлов, номера строк и имена функций с помощью API StackWalk64
, SymGetSymFromAddr64
и SymGetLineFromAddr64
из WinDBG.
Однако DWORD64 Params[4]
в STACKFRAME64
, которое является значением, возвращаемым из StackWalk64
, поддерживает считывание только четырех 64-битных параметров функции из кадра. Хуже того, в 32-битной системе используются только младшие 32 бита Params[4]
, поэтому один параметр с более чем 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 для чтения ВСЕХ параметров из кадра стека без ограничений.
Я думал использовать _9 _ / _ 10_ для извлечения значений из стека (x86 / x64) и регистров (x64). Но все же, если я это сделаю, можно будет получить только «возможные» значения параметров.
Есть ли какой-нибудь API, который я мог бы использовать для получения точных значений? Было бы даже лучше, если бы я мог получить тип и название параметров.
SymGetSymFromAddr64
, в котором вы указываете ему стековой фрейм и индекс параметра, а не просто указатель. - person Mooing Duck   schedule 18.04.2014SymGetSymFromAddr64
дает вам символьное имя самой функции, которое является искаженным именем C ++. Если вы запустите это с помощью деманглера, вы можете получить типы параметров, хотя знания одного типа, вероятно, недостаточно для интерпретации членаParams
. Но я думаю, что это все, что вам нужно. - person Mooing Duck   schedule 18.04.2014Params
правильный, поскольку это именно то, что происходит внутри, и у него нет способа узнать, как их объединить. - person Mooing Duck   schedule 18.04.2014IMAGEHLP_STACK_FRAME
(либо вручную из других структур, либо с помощью некоторого API, который я не смог найти), тогда вы можете использоватьSymSetContext
иSymEnumSymbols
, чтобы найти все (отображается, если не оптимизировано) аргументы функции. это даст вам указатель наSYMBOL_INFO
структуру, которую вы можете использовать для получения всей нужной информации. - person Raxvan   schedule 22.04.2014