Что произойдет, если мы добавим строки в код IL и добавим точки останова в нашу программу?
Если я добавлю, скажем, 1 строку в начале метода, если я установлю точку останова через Visual Studio в первой строке, будет ли она указывать на первую строку или вторую? Если он помечает неправильную строку, можем ли мы что-то сделать при редактировании файлов.exe, чтобы обеспечить регулярную сессию отладки позже?
Есть ли что-то вроде установки строки х, чтобы быть Y? Я помню, что где-то видел подобное, не уверен, что.NET связан или нет.
4 ответа
Вам нужно будет обновить символы отладки в файле PDB, если вы хотите, чтобы процесс отладки оставался неизменным.
Лучший вариант для этого, который я видел, это использовать Mono.Cecil, так как он поддерживает (ограниченную) модификацию символов отладки, а также IL.
Если вы модифицируете IL, тогда файлы PDB будут содержать устаревшую информацию. Обратите внимание, что, вероятно, не будет 1:1 между изменениями в строках IL для # строк C# (например, вставка 3 операторов IL не сместит точку останова IDE на 3 строки C#).
Возможно, вы захотите разделить IL-модифицированные части вашего кода на отдельные методы, чтобы минимизировать влияние. Кроме того, предполагая, что именно вы выполняете модификацию IL, вам может быть удобно переключаться между представлениями C# и IL во время отладки.
Вам может понадобиться немного поработать с сгенерированным кодом, чтобы облегчить это. Например, если внедренный IL может находиться в методе-обертке, вы можете указать отладчику игнорировать его, используя атрибуты атрибута, такие как DebuggerStepThroughAttribute, DebuggerNonUserCodeAttribute или DebuggerHiddenAttribute. (Посмотрите документацию на нюансы в поведении)
Как вы добавляете IL? Если вы делаете это с помощью инструментальных средств профилировщика (SetILFunctionBody), то вам также необходимо предоставить новую карту кодов IL (SetILInstrumentationCodeMap), чтобы отладчик узнал об изменении IL.