2015-07-29 3 views
1

Я хочу получить собственный (x86) код функции debugee из отладчика с использованием ICorDebug API. Получив ICorDebugFunction, я могу вызвать GetNativeCode, но он возвращает собственный код, только если он был Jited. Так что мне нужно сделать это. RuntimeHelpers.PrepareMethod может это сделать, но ему нужен метод handle (не токен метода). Из отладчика у меня есть токен метода, но не дескриптор метода. Итак, можно ли получить реальный объект MethodInfo (который может получить мне дескриптор) функции debugee от отладчика? Другими словами, можно ли отвлечься от дебюганта от дебюта?Можем ли мы отразиться на debugee от отладчика в .Net

ответ

3

Не совсем.

Вы можете использовать IMetadataImport et. al., чтобы получить статическую информацию и некоторые динамическая информация доступна непосредственно через ICorDebug апи, но и любой другой вид отражения необходимо будет работать на отлаживаемом (которые обычно используют ICorDebugeEval).

Если вы не против использования ICorDebugEval для выполнения вашего отражения на debuggee, вы можете использовать следующую последовательность.

  1. ICorDebugAppDomain::GetObject, чтобы получить ICorDebugValue, представляющий объект AppDomain в отлаживаемом.
  2. AppDomain.GetAssemblies() и Assembly.Module, чтобы найти объект модуля.
  3. Передайте токен метаданных в Module.ResolveMember(int), чтобы получить MethodBase.
  4. Используйте MethodBase.MethodHandle, чтобы получить ручку времени выполнения.

В зависимости от вашего варианта использования, возможно, было бы полезно объединить последние 3 шага с вашим вызовом PrepareMethod в вспомогательный метод в отдельной сборке, в которой вы используете загрузку отладки.

Смежные вопросы