Мне было интересно, есть ли способ получить EBP потока в другом процессе (на С++ в Windows), кроме использования «GetThreadContext». Я подозреваю, что этот метод занимает слишком много времени (я часто его использую), и если бы я мог получить только EBP, а не все значения CONTEXT, это было бы быстрее.
Я думал об использовании «ReadProcessMemory», а затем получение EBP с остальной частью стека вызовов, но я не знаю, где должен быть стек и откуда его взять.
Если кто-нибудь знает лучший способ, я был бы рад услышать об этом.
спасибо :)
Получение EBP потока в другом процессе
Ответы (2)
Текущее значение EBP другого потока, конечно, находится в регистре EBP, если поток выполняется. Если он не запущен, он сохраняется планировщиком в ядре. GetThreadContext извлекает то, что находится в ядре; ничто другое не будет быстрее.
Ситуация с производительностью хуже, чем я понял, когда писал это. Если поток запущен, ядро использует механизм APC, чтобы получить для вас актуальное значение. Это не быстро, но другого альтернативного API нет.
GetThreadContext будет единственным способом, потому что EBP — это регистр; процессор сохраняет его при переключении контекста. Единственный способ прочитать регистры потока — это GetThreadContext.
Конечно, нет никакой гарантии, что EBP имеет нужное вам значение... функции, скомпилированные с пропуском указателя кадра, не будут надежно устанавливать EBP на указатель кадра текущего кадра вызова.
Если вы просто ищете трассировку стека (наиболее распространенная причина, по которой нужно начать с EBP), могу ли я предложить StackWalk64?