Best tools noone uses: autoexp.dat

Не прошло и полугода, как родилось продолжение к пилотной серии про underdog tools. Очередной отличный инструмент, которым регулярно не пользуются, это autoexp.dat.

autoexp.dat - это файл с настройками показа всякого в соответствующих окошках Visual Studio. В секции [autoexpand] можно задать свои правила формирования строки value для сложных объектов в окошках watches/variables, типа такого:

  1. CPlayer=life=<m_fLHitsLeft> speed=(<m_vVelocity.x>, <m_vVelocity.y>)

Эта же самая строка будет показана и при наведении мышкой на переменную. Поддерживаются всякие модификаторы скалярных типов а-ля printf; есть модификаторы для ASCII и Unicode строк. Файл автоматически перегружается при каждом запуске отладчика; те. студию перезапускать не надо, только сессию отладки. Синтаксис слегка документирован.

Однако [autoexpand] поддерживает только простейшие выражения - например, оно не сумеет перемножить два поля. Но тут в 2005й студии приходит на выручку секция [visualizer]. Ее синтаксис в файле не документирован совсем, однако несложно наполовину догадаться, остальное нагуглить. Строчка, которую можно задать в [autoexpand], здесь называется preview:

  1. CPlayer{
  2.         preview ( #( "life=", [$c.m_fHitsLeft*$c.m_fHitsFactor], " speed=(", $c.m_vVelocity.x, ",", $c.m_vVelocity.x, ")" ) )
  3. }

Токен $c символизирует текущую переменную, список элементов создается строчкой #( … ). Выражения поддерживаются несколько более сложные, чем в autoexpand; еще preview из секции visualizer более приоритетно, чем autoexpand.

Но это еще не конец, секция visualizer позволяет и показ списка детей перекроить по-своему. Пример для самописного шаблонного вектора:

  1. CMyVector<*>{
  2.         children(#(
  3.                 [raw-members]: [$c,!],
  4.                 [size] : $c.m_iLength,
  5.                 #array ( expr : $c.m_pData[$i], size : $c.m_iLength )
  6.         ))
  7. }

Что происходит в этом примере? Список детей для инстанса шаблона CMyVector с любым параметром подменяется со стандартного на наш собственный - с элементами raw-members, size, и массивом выражений, которые вычисляются по указанному правилу. Результат выглядит примерно вот так:

Несколько удобнее, чем тупо пялиться на значение указателя, да.

Вдобавок к этому всему, visualizer умеет #if, #else, #switch, #list, #tree - те. условные переходы (везде) и поддержку отображения списков и деревьев - так что у заинтересованных читателей есть масса пространства для упражнений.

2 Comments

  1. vortex:

    Почему никто? Мы пользуемся. Давным давно уже написали вижуалайзеры для наших типов, и радуемся. :) А так да. Функциональность очень полезная.

  2. Earwin:

    Для Lua есть комплект вижуалайзеров, чтобы можно было по lua-стейтам и прочим структурам с комфортом шариться.

Leave a comment

You must be logged in to post a comment.