Как я отлаживаю код IL, сгенерированный во времени выполнения с помощью Отражения. Испустить

Самый простой способ (на сегодняшний день) будет иметь по запросу клиентские фрагменты аудиофайла. std::net::TcpStream (это то, что, как вы сказали, вы используете) не имеет метода регулирования скорости передачи, поэтому у вас нет многих возможностей ограничить потоковую передачу, кроме использования жестко заданных задержек потоков.

Например, ваш клиент может сохранить сегмент аудио, а когда пользователь, прослушивающий аудио, достигает определенной точки до конца сегмента (или пропускает его вперед), клиент отправляет запрос на сервер. получить соответствующий сегмент.

Это похоже на работу реальных потоковых сервисов (таких как Youtube), потому что, как вы сказали, было бы плохой идеей хранить весь файл на стороне клиента.

9
задан Autodidact 28 June 2012 в 08:50
поделиться

6 ответов

Я нашел еще некоторую справку здесь...

DebuggerVisualizer для DynamicMethod (Показывают мне IL) Это, отладчик visualizer использование, которое Вы сможете видеть сгенерированный IL во времени выполнения!

И еще лучше Отлаживает LCG, который позволяет Вам отлаживать сгенерированный код при использовании времени выполнения Windbg!

9
ответ дан 4 December 2019 в 20:25
поделиться

Попытайтесь использовать peverify инструмент для проверки IL. Из MSDN:

peverify.exe выполняет всесторонние проверки проверки MSIL на основе анализа потока данных плюс список нескольких сотен правил о допустимых метаданных. Для получения дальнейшей информации на проверках Peverify.exe работает, посмотрите "Спецификацию Проверки Метаданных" и "Спецификацию Системы команд MSIL" в папке Tools Developers Guide в Платформе.NET SDK.

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

2
ответ дан 4 December 2019 в 20:25
поделиться

Это не может помочь Вам в конце отладки, но RunSharp является хорошим инструментом для генерации IL, который помогает Вам избежать распространенных ошибок. Это делает Запись чувством IL намного более сходно с записью C#.

Вот обзор с примерами: http://www.codeproject.com/KB/dotnet/runsharp.aspx

0
ответ дан 4 December 2019 в 20:25
поделиться

Нет никакого способа отладить IL непосредственно в смысле использования отладчика (не встроенный, по крайней мере). У Вас действительно только есть две опции здесь

  1. Попросите Грабить предложенный. Вручную выведите IL и ilasm в DLL/EXE. Затем выполненный peverify на получающемся DLL для наблюдения ошибки.
  2. Если Вы на самом деле желаете отладить IL затем, Вы, вероятно, застреваете с выполнением его необработанный блок.
0
ответ дан 4 December 2019 в 20:25
поделиться

Необходимо испустить символьную информацию, чтобы смочь отладить IL.

Испускание символьной информации с отражением испускает

и соответствуйте испускаемым кодам операций соответствующему местоположению в Вашем файле, который испускает его. (Где ILGenerator. Испустите (), вызов).

Но это - конечно, не тривиальная задача.

Править:

Вы не можете отладить код, который не поддается проверке, это не получает Редактора монеты в пять центов вообще. Необходимо проверить корректное использование операции в секунду IL. каждый из имеют в стеке надлежащие операнды необходимого типа, который он ожидает?

Редактирование 2:

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

Редактирование 3: К сожалению, информация об отладке не может быть испущена с помощью DynamicMethod, но WinDBG может использоваться для дампа IL, Jose Fco Bonnin объясняет это в своем блоге. Выполнение динамического IL с DynamicMethod:

Основная проблема, которую мы испытываем с DynamicMethod, состоит в том, что у нас нет способности генерировать информацию об отладке для LCG, начиная с отладки API основан на метаданных, которые не имеет LCG. В любом случае не все потеряно, так как мы можем продолжить отлаживать с WinDBG...

процесс объяснен далее в сообщении.

0
ответ дан 4 December 2019 в 20:25
поделиться
ldarg.1
ldarg.0
ldfld, System.String FirstName
callvirt, Void Write(System.String)

На данном этапе у Вас все еще есть arg1 на стеке.

0
ответ дан 4 December 2019 в 20:25
поделиться