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: двигайте выделение там, смотрите здесь.