December 12th, 2009

glider

Вдохновение

В перерывах между работой и сном сейчас читаю книжку "Муки и радости", в которой Ирвинг Стоун рассказывает о жизни Микеланджело. Как и в "Мартине Идене" мне здесь нравится описание вдохновения и творческой страсти. Очень впечатляет.
glider

Reflection.Emit и многомерные массивы

После трех дней попыток побороть рефлекшн.эмит (см. заметки о баге, его соседях и попытке пофиксить), я могу сказать только одно - не надо даже пробовать юзать MD-массивы и Reflection.Emit. То есть, реф.эмитом не стоит даже и пытаться: эмиттить ссылки на филды, проперти, методы, что угодно, где есть хоть какое-то упоминание о многомерных массивах.

Даже если быть вооруженным пониманием причины проблемы и думать "ай, ну здесь-то точно не будет косяков, попробую-ка я вот так", то все равно можно натолкнуться на безумные проявления бага. Например: 1) неработающий override, 2) падающий BadImageFormatException там, где все мембер-рефы заэмиччены правильно, а также мой любимый: 3) Object::ToString, сваливающийся с наллрефом. Все это, конечно, логично - в случае #1 CLR не находит перекрывающий метод, в случае #2 неверный токен таки-просочился в метадату, а в случае #3 дефолтный ToString юзает GetType().Name, а геттайп возвращает null, ибо не может зарезолвить тип. Но сходу такие баги отловить почти невозможно - ибо они нарушают привычные представления о том, как работает фреймворк.

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

Причина адского бага
glider

StackFrame::GetILOffset

Походу меня продолжают преследовать баги фреймворка. В своей практике не припомню и одного момента, когда я ловил неочевидные и блокирующие мою работу ошибки в FCL, а тут за четыре дня целых три бага. Причем штуки вылазят в офигенно неожиданных местах - как, например, Object::ToString(), падающий с NullReferenceException, что вводит в дикий когнитивный диссонанс.

Сегодня наткнулся на то, что при невыясненных условиях метод GetILOffset некоторых стек-фреймов возвращает 0 вместо корректного значения. К счастью, нашелся быстрый воркараунд - GetNativeOffset вроде бы (я уже никому не верю, емае) работает корректно. Если честно, особо нет уже времени выяснять, что к чему, поэтому точного сценария воспроизведения составлять не буду.
glider

Многопоточная отладка

Господи, как бы упростился многопоточный дебаг, если бы для дотнета был omniscient debugging. Сочетание возможностей удобного дебага студии (evaluation: normal & via IL interpreting, pinning, notes) и всеведущего дебаггера = эпик вин. Картинка ниже меня приводит в чувство бурного восторга и неслабой зависти.

Всеведущий дебаггер (обазятельно откройте картинку)