Можно ли при использовании неуправляемого API для платформы .NET для профилирования внутрипроцессного процесса .NET найти указатель инструкций IL, который соответствует собственному указателю инструкций, предоставленному функции StackSnapshotCallback?
Как, вероятно, очевидно, я делаю снимок текущего стека и хотел бы предоставить информацию о номере файла и строке в дампе стека. Managed Stack Explorer делает это, запрашивая ISymUnmanagedMethod::GetSequencePoints
. Это здорово, но точки последовательности связаны со смещениями, и я до сих пор предполагал, что это смещения с начала метода (на промежуточном языке).
В последующем комментарии к своему сообщению в блоге Обход стека профайлеров: основы и не только, Дэвид Броман указывает, что это сопоставление может быть достигнуто с помощью ICorDebugCode::GetILToNativeMapping
. Однако это не идеально, так как для получения этого интерфейса требуется присоединение к моему процессу из другого процесса отладчика.
Я хотел бы избежать этого шага, потому что я хотел бы по-прежнему иметь возможность запускать свое приложение из отладчика Visual Studio, пока я делаю эти снимки. Это упрощает нажатие на номер строки в окне вывода и переход к нужному коду.
Функциональность возможна .... вы можете выплюнуть трассировку стека с номером строки по желанию внутри управляемого кода, единственный вопрос, доступен ли он. Кроме того, я не хочу использовать функциональность System::Diagnostics::StackTrace
или System::Environment::StackTrace
, потому что по соображениям производительности мне нужно отложить фактический дамп стека... поэтому желательно сохранить затраты на разрешение имен методов и расположение кода на потом. ... наряду с возможностью смешивать собственные и управляемые кадры.