Что произойдет, если мы добавим строки в код 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. (Посмотрите документацию на нюансы в поведении)

Я ожидаю, что вы помечены как файл.pdb может не совпадать.

Как вы добавляете IL? Если вы делаете это с помощью инструментальных средств профилировщика (SetILFunctionBody), то вам также необходимо предоставить новую карту кодов IL (SetILInstrumentationCodeMap), чтобы отладчик узнал об изменении IL.

Другие вопросы по тегам