Best tools noone uses: autoexp.dat
Не прошло и полугода, как родилось продолжение к пилотной серии про underdog tools. Очередной отличный инструмент, которым регулярно не пользуются, это autoexp.dat.
autoexp.dat - это файл с настройками показа всякого в соответствующих окошках Visual Studio. В секции [autoexpand] можно задать свои правила формирования строки value для сложных объектов в окошках watches/variables, типа такого:
-
CPlayer=life=<m_fLHitsLeft> speed=(<m_vVelocity.x>, <m_vVelocity.y>)
Эта же самая строка будет показана и при наведении мышкой на переменную. Поддерживаются всякие модификаторы скалярных типов а-ля printf; есть модификаторы для ASCII и Unicode строк. Файл автоматически перегружается при каждом запуске отладчика; те. студию перезапускать не надо, только сессию отладки. Синтаксис слегка документирован.
Однако [autoexpand] поддерживает только простейшие выражения - например, оно не сумеет перемножить два поля. Но тут в 2005й студии приходит на выручку секция [visualizer]. Ее синтаксис в файле не документирован совсем, однако несложно наполовину догадаться, остальное нагуглить. Строчка, которую можно задать в [autoexpand], здесь называется preview:
-
CPlayer{
-
preview ( #( "life=", [$c.m_fHitsLeft*$c.m_fHitsFactor], " speed=(", $c.m_vVelocity.x, ",", $c.m_vVelocity.x, ")" ) )
-
}
Токен $c символизирует текущую переменную, список элементов создается строчкой #( … ). Выражения поддерживаются несколько более сложные, чем в autoexpand; еще preview из секции visualizer более приоритетно, чем autoexpand.
Но это еще не конец, секция visualizer позволяет и показ списка детей перекроить по-своему. Пример для самописного шаблонного вектора:
-
CMyVector<*>{
-
children(#(
-
[raw-members]: [$c,!],
-
[size] : $c.m_iLength,
-
#array ( expr : $c.m_pData[$i], size : $c.m_iLength )
-
))
-
}
Что происходит в этом примере? Список детей для инстанса шаблона CMyVector с любым параметром подменяется со стандартного на наш собственный - с элементами raw-members, size, и массивом выражений, которые вычисляются по указанному правилу. Результат выглядит примерно вот так:

Несколько удобнее, чем тупо пялиться на значение указателя, да.
Вдобавок к этому всему, visualizer умеет #if, #else, #switch, #list, #tree - те. условные переходы (везде) и поддержку отображения списков и деревьев - так что у заинтересованных читателей есть масса пространства для упражнений.
vortex:
Почему никто? Мы пользуемся. Давным давно уже написали вижуалайзеры для наших типов, и радуемся. :) А так да. Функциональность очень полезная.
16 June 2008, 6:34 pmEarwin:
Для Lua есть комплект вижуалайзеров, чтобы можно было по lua-стейтам и прочим структурам с комфортом шариться.
16 June 2008, 6:40 pm