Перейти к содержанию

Inspector

Inspector показывает одно значение целиком — то, что выбрано в Переменных. Открывается по Ctrl+I.

Строки дерева переменных однострочные: это правильно, когда просматриваешь область видимости, и неправильно, когда смотришь на JSON-строку в 40 КБ. Именно в Inspector такое значение становится читаемым.

Что показывает

Для выбранной строки:

  • имя — сверху;
  • форму значения — к какому виду отладчик его отнёс;
  • само значение моноширинным шрифтом, с переносом, а не с обрезкой;
  • предупреждение, если адаптер обрезал значение — сказанное прямо, чтобы неполное значение нельзя было принять за полное.

Если в Variables ничего не выбрано, панель пишет select a variable.

Исключение из этого списка — байтовый массив: собственного значения у него нет, и показывается он по-своему — см. раздел «Байтовые массивы» ниже.

Действия

Кнопка Что делает
Copy кладёт значение в буфер обмена
Format as JSON кладёт переформатированную версию, если значение разбирается как JSON

Кнопка Format as JSON появляется только у значений, которые действительно разбираются как JSON. Форматирование — операция только для просмотра: адаптеру ничего не отправляется, значение времени выполнения не меняется и остаётся во владении отлаживаемой программы.

Байтовые массивы

[]byte, Vec<u8>, char[] — дерево показывает их правильно и оттого нечитаемо: сорок восемь строк по одному числу там, где лежит строка текста. Для таких значений Inspector показывает сами байты, а не то, что прислал адаптер: у родителя в значении только len и cap.

Сверху — размер: 48 bytes, а пока часть значения ещё едет — 48 of 512 bytes. Под ним переключатель:

Режим Что показывает
Text байты, раскодированные как UTF-8; невалидные последовательности заменяются символом замены
Hex дамп в стиле xxd: смещение, шестнадцать байт, колонка ASCII

Режим выбирается сам: в основном печатный и валидный UTF-8 открывается как Text, всё остальное — заголовок gzip, сообщение protobuf, картинка — открывается как Hex, потому что экран символов замены не сказал бы ничего. Выбор можно переопределить, и держится он ровно пока держится выделение: режим, унаследованный от прошлой переменной, обещал бы про новую то, чего никто не проверял.

Copy копирует то, что на экране: текст в режиме Text, дамп в режиме Hex.

Недостающее Inspector дозапрашивает сам. Свёрнутый узел не просил ничего, поэтому при выделении байты запрашиваются постранично — до 64 КБ, — а если адаптер не сказал, сколько их всего, узел берётся целиком: пагинировать нечем. Дальше значение показывается обрезанным и говорит об этом: панель показывает текст, а не образ памяти.

Если адаптер обрезал значение

Адаптеры ограничивают и длину возвращаемых значений, и глубину, на которую они спускаются в структуру. И то и другое видно как сообщение об обрезке: строка со счётчиком ...+1024 more, дамп структуры, оборванный на ,..., и вложенное значение, свёрнутое в {...}, — всё это значения, пришедшие неполными. Когда Inspector сообщает об обрезке, недостающая часть просто не была прислана, и никакая прокрутка её не покажет — Inspector показывает всё, что пришло.

У структуры остальное смотрят в дереве: раскрытие узла запрашивает его поля заново, и лимиты адаптера применяются к ним с начала, уровень за уровнем.

Чтобы увидеть больше, спрашивайте нужную часть, а не значение целиком: диапазон индексов, поле, длину. Для этого есть Evaluate — выражение вроде buffer[0:200] вернёт то, что адаптер готов отдать полностью.

Клавиатура

Собственных строк у Inspector нет, поэтому J / K здесь ничего не делают. Панель следует за выделением в Variables: двигайте выделение там, смотрите здесь.