Мне было интересно, есть ли способ получить EBP потока в другом процессе (в C++ в Windows), кроме использования «GetThreadContext». Я подозреваю, что этот метод занимает слишком много времени (я его много использую), и если бы я мог получить только EBP, а не все значения CONTEXT, это было бы быстрее.
Я думал об использовании «ReadProcessMemory», а затем получал EBP с остальной частью стоп-кадра, но я не там, где должен быть стек, и откуда я его получу.
Если кто-нибудь знает лучший способ, я буду рад услышать об этом.
thanks :)Получение EBP потока в другом процессе
ответ
Текущее значение EBP другого потока, конечно, находится в регистре EBP, если поток работает. Если он не запущен, он сохраняется в планировщике ядра. GetThreadContext извлекает то, что находится в ядре; больше ничего не будет.
Состояние исполнения хуже, чем я понял, когда писал это. Если поток работает, ядро использует механизм APC для получения обновленного значения для вас. Это не скоро, но нет другого альтернативного API.
GetThreadContext будет единственным способом, поскольку EBP является регистром; процессор сохраняет его, когда он выполняет контекстный переключатель. Единственный способ прочитать регистры потока - это GetThreadContext.
Конечно, нет гарантии, что EBP имеет значение, которое вы хотите в нем ... функции, скомпилированные с упущением указателя кадра, не будут надежно иметь EBP для указателя кадра текущего кадра вызова.
Если вы просто ищете трассировку стека (самая распространенная причина для того, чтобы начать работу с EBP), могу ли я предложить StackWalk64?
Что вы пишете, профайлер? Возможно, если вы объясните свою проблему, кто-то может дать вам более быстрый способ. – 2010-12-04 23:55:50
Да, профайлер :) – Idov 2010-12-05 06:53:00