Таинственные знаки на полях — разгадка

в 10:57, , рубрики: Visual Studio, отладка, метки: ,

Таинственные знаки на полях — разгадкаИтак, время для верного ответа на ранее опубликованную задачку. Спасибо всем поучаствовавшим. Первым же комментарием к посту была вывешена вот эта ссылка. Я, признаться, верил, что она появится не сразу и позволит чуть-чуть продлить интригу. Но Хабр есть Хабр и на каждую хитрую гайку тут найдется свой болт с левой резьбой — и это прекрасно, за то его и любим.

Однако не так был прост конкурс, чтобы его можно было выиграть одной лишь ссылкой на MSDN — там объясняются лишь знаки 1, 2, 3, 7 и 8. А вот что означают и чем друг от друга отличаются 4, 5 и 6 — в этом и была сама задача. К сожалению, многие посчитали первый комментарий верным ответом и отказались от дальнейшего участия. А зря. Прошу под кат.

Поскольку значки 1, 2, 3, 7 и 8 верно объяснили фактически все, перейдем к самому хитрому — строкам 4, 5 и 6. Многие догадались, что изображения в этих вариантах являются комбинацией точки остановки (breakpoint) и точки трассировки (tracepoint), установленных на одну и ту же строку. В этом месте с галёрки прозвучал вопрос «А как же поставить на одну строку оба типа точек, ведь после установки любой из них в контекстном меню строки пропадает пункт установки точки второго типа?» Единственный известный мне способ это сделать — поставить breakpoint и tracepoint на разные строки, а потом для любой из них открыть контекстное меню, выбрать пункт «Location» и в открывшемся диалоге вручную указать строку второй точки. Это и приводит к появлению таких вот значков, как в строках 4, 5 и 6.

Таинственные знаки на полях — разгадка

Но подождите! Почему же отличаются на вид знаки, например, в строках 5 и 6? И почему в задании было сказано, что знаки 4 и 6 тоже отличаются и означают разные вещи — ведь они так похожи на вид! И тут мы пришли к тому, что нельзя было нагуглить или вычитать в MSDN. Перед нами ни что иное, как 2 бага в Visual Studio — один из них допущен программистами, а второй — дизайнерами. При чём они присутствуют во всех известных мне версиях Visual Studio (200520082010).

Программерский баг

В строках 5 и 6 находятся абсолютно одинаковые вещи. В каждой из них есть ровно один простой активный breakpoint и ровно один простой активный tracepoint. Точки останова и трассировки для обоих строк были добавлены одинаковым способом и в одинаковом порядке (сначала breakpoint по F9, потом tracepoint на следующую строку, потом перенос tracepoint на одну строку назад), привязаны к одному и тому же символу в строке (первому). И тем не менее Visual Studio рисует в одном случае круг поверх ромба, а во-втором — наоборот, вынуждая людей делать дикие предположения о важности порядка установки точек, их приоритете или порядке их срабатывания. А это просто баг в алгоритме рисования иконок.

Дизайнерский баг

И вот мы пришли к главной интриге — чем же отличаются значки в строках 4 и 6? Мы уже знаем, что находится в строке 6 (breakpoint + tracepoint). А вот в строке 4 находится ровно то же самое, с одним лишь отличием — tracepoint находится в выключенном (disabled) состоянии. Если бы он был сверху — мы бы чётко увидели незаполненный ромб, но он, зараза, снизу и поэтому единственное, что нам может подсказать визуально его выключенное состояние — это цвет и форма вершин ромба, которые слегка выступают за границы круга. То, что они действительно разные, заметно в Visual Studio, если кликать по флажку включениявыключения точки трассировки и внительно смотреть на значек — глаз почти любого человека замечает момент изменения цвета, хотя 9 из 10 людей посмотрев на значки в статичном состоянии, скажут, что они одинаковые.

Таинственные знаки на полях — разгадка

Я никогда не поверю, что это сумасшествие было сделано специально — скорее всего и этот баг и предыдущий являются просто следствием того, что ситуацию «breakpoint + tracepoint» вообще никто специально не проектировал, не писал и не тестировал. Она просто как-то случайно работает, но довести это всё до ума ни у кого не доходят руки — есть более насущные задачи.

Салют, шампанское и объявление победителя

Очень много народу дали 6-7 верных ответов из 8-ми. Это очень хорошие результаты. Однако победителем признаётся вот этот ответ в твиттере от человека с ником Yanzay. Он первым ясно подчеркнул описанные выше детали: disabled tracepoint + активный breakpoint в строке 4, а также фактическая идентичность точек остановки и трассировки в строках 5 и 6 (обе обычные, в активном состоянии). Ограничения твиттера тут сыграли ему на руку — ничего лишнего написать места не хватило (именно это помешало некоторым), а верный ответ дан. Поздравляю! В течении суток я спишусь с победителем в твиттере по поводу вручения инвайта.

Автор: tangro


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js