Профилирование динамического вывода

Я работаю над профилировщиком MSIL и столкнулся с проблемами с обратными вызовами ManagedToUnmanagedTransitionи UnmanagedToManagedTransitionинтерфейса ICorProfilerCallback.

Я хочу получить информацию о вызываемом методе (имя и имя модуля, в котором он находится).

До сих пор все работало нормально. До тех пор, пока не произошло так называемое динамическое подключение (подробно описано по адресу: http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-. net-_2800_c_23002900_.aspx)

В этом сценарии IMetaDataImport::GetPinvokeMapне выполняется. Также IMetaDataAssemblyImport::GetAssemblyPropsвозвращает «dynamic_pinvoke» в качестве имени сборки.

profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataImport, (IUnknown**) &imd_import, &md_token);
imd_import->GetPinvokeMap(md_token, &mapping, module_name, buffer_size, &chars_read, &md_module_ref);
// here the fail occurs

profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataAssemblyImport, (IUnknown**) &imd_assembly_import, &md_token);
imd_assembly_import->GetAssemblyFromScope(&md_assembly);
imd_assembly_import->GetAssemblyProps(md_assembly, 0, 0, 0, assembly_name, buffer_size, &chars_read, 0, 0);
// assembly_name is set to "dynamic_pinvoke"

Как получить имя модуля (.dll) и имя вызываемой функции с помощью динамического запуска?

62
задан valiano 26 February 2019 в 21:33
поделиться