2010-12-03 2 views
1

Мне было интересно, есть ли способ получить EBP потока в другом процессе (в C++ в Windows), кроме использования «GetThreadContext». Я подозреваю, что этот метод занимает слишком много времени (я его много использую), и если бы я мог получить только EBP, а не все значения CONTEXT, это было бы быстрее.
Я думал об использовании «ReadProcessMemory», а затем получал EBP с остальной частью стоп-кадра, но я не там, где должен быть стек, и откуда я его получу.
Если кто-нибудь знает лучший способ, я буду рад услышать об этом.
thanks :)Получение EBP потока в другом процессе

+1

Что вы пишете, профайлер? Возможно, если вы объясните свою проблему, кто-то может дать вам более быстрый способ. – 2010-12-04 23:55:50

+0

Да, профайлер :) – Idov 2010-12-05 06:53:00

ответ

3

Текущее значение EBP другого потока, конечно, находится в регистре EBP, если поток работает. Если он не запущен, он сохраняется в планировщике ядра. GetThreadContext извлекает то, что находится в ядре; больше ничего не будет.

Состояние исполнения хуже, чем я понял, когда писал это. Если поток работает, ядро ​​использует механизм APC для получения обновленного значения для вас. Это не скоро, но нет другого альтернативного API.

1

GetThreadContext будет единственным способом, поскольку EBP является регистром; процессор сохраняет его, когда он выполняет контекстный переключатель. Единственный способ прочитать регистры потока - это GetThreadContext.

Конечно, нет гарантии, что EBP имеет значение, которое вы хотите в нем ... функции, скомпилированные с упущением указателя кадра, не будут надежно иметь EBP для указателя кадра текущего кадра вызова.

Если вы просто ищете трассировку стека (самая распространенная причина для того, чтобы начать работу с EBP), могу ли я предложить StackWalk64?