Отладка компилятора .net - PullRequest
5 голосов
/ 26 марта 2012

В настоящее время я работаю над компилятором для языка (внешнего байт-кода) и использую System.Reflection.Emit.

Теперь все выглядит нормально, когда я открываю сгенерированную сборку в рефлекторе, и она также прекрасно компилируется в C # (и запускается), но когда я пытаюсь запустить основную функцию, которая генерируется, я получаю InvalidProgramException * * 1005

"Common Language Runtime обнаружил недопустимую программу."

Вероятно, причиной является только один код операции, но, поскольку эта основная функция использует более 100 кодов операций, я не могу определить, какой код операции вызывает проблему.

Каждый код операции очень сложен, поэтому тестирование каждого кода операции вручную не требуется.

Есть ли способ получить .NET, чтобы сказать мне, где в функции он обнаруживает недопустимую программу?

А если нет, могу ли я использовать какой-либо другой инструмент для определения источника проблемы?

1 Ответ

10 голосов
/ 26 марта 2012

Я бы лучше написал это как ответ.Вы можете использовать инструмент PEVerify для выполнения проверки сборки.Он входит в состав инструментария Windows SDK. Лучший способ запустить его - использовать командную строку Visual Studio, команду peverify.exe.Вы захотите запустить его с параметром командной строки / il, чтобы проверить сгенерированный вами IL, / md, чтобы проверить метаданные сборки.

Вы получите лучшую диагностику из этого инструмента, исключение времени выполнения, котороегенерируемый джиттер слишком неинформативен, чтобы точно определить точную ошибку.Я не могу ручаться, что он выполняет точные те же проверки, что и джиттер, это отдельные фрагменты кода, и джиттер имеет некоторые преимущества перед статическим анализом.Однако этот инструмент был специально разработан для вашего случая использования людьми, которые пишут генераторы IL.Я просто процитирую обещания, сделанные в статье MSDN:

Peverify.exe выполняет всесторонние проверки MSIL на основе анализа потока данных плюс список из нескольких сотен правил для допустимых метаданных.Подробные сведения о проверках, выполняемых Peverify.exe, см. В разделе «Спецификация проверки метаданных» и «Спецификация набора инструкций MSIL» в папке «Руководство по разработке средств» в комплекте для разработки программного обеспечения Windows (SDK).

Оказывается, это хорошо сработало для вас, это круто :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...