Получение EBP потока в другом процессе - PullRequest
1 голос
/ 03 декабря 2010

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

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

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

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

1 голос
/ 03 декабря 2010

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

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

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

...