Как работает программа debug

В этом руководстве мы поговорим о том, как отладить код Go с помощью Visual Studio Code, а также установить необходимые расширения, инструменты анализа и отладчики.

Сначала мы создадим простое тестовое приложение, а затем рассмотрим использование обычных и условных точек останова.

Благодаря этому набору навыков вы сможете точнее оценить состояние вашего приложения в определенные моменты выполнения его кода.

Требования

  • Базовые знания по Go.
  • Копия Go на вашем компьютере. Чтобы установить Go, следуйте руководству Установка Go и настройка локальной среды разработки в macOS, Ubuntu или Windows.
  • Установка Visual Studio Code на вашем компьютере.
  • Плагин VSCide-Go. После установки плагина откройте любой файл .go в VS Code. В правом нижнем углу строки состояния вы увидите Install Analysis Tools. Нажмите на эту ссылку, чтобы установить пакеты Go, необходимые для эффективной работы плагина.
  • Установка Delve, отладчика для Go с открытым исходным кодом. Подробные инструкции по установке для конкретных платформ вы найдете здесь.

1: Создание тестового приложения

В этом мануале мы будем использовать два примера для отладки кода Go:

How programmers debug code #softwareengineer #programming #coding #code #programminghumor

  • Программа Go, создающая файл JSON.
  • Функция и тест.

Ниже вы найдете исходный код для первого примера – программы. Создайте файл main.go:

Добавьте в файл следующий код:

package main import ( «encoding/json» «fmt» «log» ) // Avenger represents a single hero type Avenger struct < RealName string `json:»real_name»` HeroName string `json:»hero_name»` Planet string `json:»planet»` Alive bool `json:»alive»` >func (a *Avenger) isAlive() < a.Alive = true >func main() < avengers := []Avenger< < RealName: «Dr. Bruce Banner», HeroName: «Hulk», Planet: «Midgard», >, < RealName: «Tony Stark», HeroName: «Iron Man», Planet: «Midgard», >, < RealName: «Thor Odinson», HeroName: «Thor», Planet: «Midgard», >, > avengers[1].isAlive() jsonBytes, err := json.Marshal(avengers) if err != nil < log.Fatalln(err) >fmt.Println(string(jsonBytes)) >

В этом коде мы определили структуру Avenger, а затем создали массив Avengers, изменили статус одного из них на “alive”, конвертировали результаты в JSON и, наконец, вывели их в STDOUT.

Вы можете запустить приложение с помощью команды:

Результат будет выглядеть так:

2: Отладка по точкам останова

Чтобы начать отладку, нам нужно создать конфигурацию. Нажмите на значок отладки в левой панели Visual Studio. Затем нажмите на шестеренку, чтобы создать конфигурацию.

Вы создадите файл конфигурации в .vscode/launch.json с показанным выше содержимым. Перенаправьте программу конфигурации на файл main.go; поскольку на данный момент у нас есть только файл main.go, мы можем перейти в root рабочей области:

How to Use a Debugger — Debugger Tutorial

Далее нам нужно добавить точку останова, потому что на таких точках и держится отладка.

Давайте добавим точку останова в строку 21 (func main()). Для этого кликните слева от номера строки, и вы увидите красную точку.

Затем нажмите либо F5, либо кнопку Launch в разделе Debug в левом верхнем углу, чтобы открыть представление Debug View.

Нажмите несколько раз кнопку Step Over на панели Debug Toolbar.

Отладчик в конечном итоге переместится на строку 40.

Раздел Debug покажет нам состояние текущей позиции точки останова.

Краткие сведения об отладчике программ debug

Программа DEBUG обеспечивает интерактивную отладку программ в формате EXE- и COM-файлов. Обычно он используется для отладки исполняемых программ, полученных с языка уровня ассемблера. Он позволяет отлаживать и исполняемые файлы .EXE и .COM, скомпилированные с языков более высокого уровня.

Отладчик DEBUG умеет:

  • прослеживать выполнение и управлять выполнением программ;
  • вносить изменения в ход выполнения и данные отлаживаемой программы;
  • вводить небольшие программы на языке ассемблера, выполнять ассемблирование этих программ и создавать исполняемые программы с расширением COM;
  • выполнять преобразование машинных шестнадцатеричных кодов команд в формат языка ассемблера (деассемблирование);
  • отображать текстовые файлы в ASCII и шестнадцатеричном формате;
  • просматривать и изменять содержимое регистров памяти МП и ячеек основной памяти;
  • загружать информацию с дисковых накопителей в основную память и наоборот (считывать информацию с дисков и записывать на них);
  • осуществлять поиск конкретных данных в текстах сообщений и программ (с выдачей адреса их хранения);
  • просматривать регистр флагов с отображением мнемокодов значений этих флагов (см. табл. 9.2).

Таблица 9.2. Используемые отладчиком DEBUG мнемокоды значений флагов

Назначение флага

Вспомогательный перенос( да/нет)

Для вызова отладчика DEBUG следует набрать в командной строке DOS слово debug и, если необходимо, имена файлов, с которыми мы будем работать, например: debug prog.exe. Приглашение к вводу команд — «–» .После завершения работы с DEBUG для выхода из него следует набрать q. После набора каждой команды следует нажимать Enter.

Основные команды отладчика debug

  • N (name) — объявление имени файла.
  • R m (register) — отображение на экране дисплея содержимого регистра памяти МП с именем m. Если m не указано, показывается содержимое всех регистров памяти МП, вектор-адрес следующей команды (CS:IP), машинный и мнемокод этой команды; например:

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A B81500 MOV AX,0015 ;

Если отображается содержимое одного регистра, то команда R позволяет изменить его содержимое:

  • A n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — начальный вектор-адрес машинных команд.
Читайте также:
Как перенести программу с одного компьютера на другой с базой данных

Пример ввода программы:

1A8E:0100 mov ax,15

1A8E:0103 mov bx,5

1A8E:0106 add ax,bx

1A8E:0108 div bx

  • U n1, n2 Lk (unassembler) — преобразование машинных кодов команд в команды на языке ассемблера и отображение их на экране дисплея, n1 — вектор-адрес 1-ой, а n2 — смещение последней из машинных команд, подлежащих деассемблированию, k — длина программы (может указываться либо n2, либо Lk). Пример деассемблирования программы:

1A8E:0100 B81500 MOV AX,0015

1A8E:0103 BB0500 MOV BX,0005

1A8E:0106 01D8 ADD AX,BX

1A8E:0108 F7F3 DIV BX

  • T k (tracing) — выполнение очередных k команд программы: Ели k не указано, то выполняется одна команда (пошаговая трассировка программы). Команды обращения к процедурам и внутренние прерывания командой Т не выполняются, так как по Т будут последовательно выполняться команды процедуры и команды обработки прерывания соответственно. В этих случаях следует использовать команду процедурной трассировки P (procedure), почти аналогичную команде T, но позволяющую автоматически полностью выполнять встречающиеся при трассировке процедуры, или команду G n. После выполнения команд (команды) на дисплей выводится:
  • содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL показываются в мнемокоде (см. табл. 9.2);
  • вектор-адрес (CS:IP);
  • машинный и мнемокоды текущей команды.

Пример трассировки программы:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0100 NV UP EI PL NZ NA PO NC

1A8E:0100 B81500 MOV AX,0015

AX=0015 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0103 NV UP EI PL NZ NA PO NC

1A8E:0103 BB0500 MOV BX,0005

AX=0015 BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0106 NV UP EI PL NZ NA PO NC

1A8E:0106 01D8 ADD AX,BX

AX=001A BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0108 NV UP EI PL NZ NA PO NC

1A8E:0108 F7F3 DIV BX

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A 48 DEC AX

  • G n (go) — выполнение EXE- или COM-программы до команды с вектор-адресом n, при отсутствии n программа отрабатывает до конца.

После выполнения команд (команды) на дисплей выводятся:

  • содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);
  • флаги регистра FL выводятся в мнемокоде (см. табл. 9.2);
  • вектор-адрес (CS:IP), машинный и мнемокод текущей команды.

После выполнения программы получим:

AX=0005 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC

1A8E:010A 48 DEC AX

  • D n, s Lk (dump) — отобразить на экране дисплея содержимое k ячеек памяти, начиная с ячейки по вектор-адресу n (по умолчанию –ни n, ни Lk не указаны: n — текущий вектор-адрес + 1 и k = 128), то есть, нажав клавиши D и Enter, можно посмотреть следующие 128 ячеек:

(Редактору. Все строчки поместить без переносов, уплотнить шрифт)

1D20:0C00 F7 07 01 00 75 12 2E C7-06 CB 98 02 00 EB 09 E8 . u.

1D20:0C10 96 00 F8 EB 0D F9 EB 0A-50 B0 03 B4 FF E8 03 00 . P.

1D20:0C20 58 F8 C3 57 26 8B 7F 04-2E 89 3E CF 98 26 88 05 X..W…e.P. .U..U..P

1D20:0C60 75 06 26 88 55 04 EB 3E-3C 04 75 0F 2E A1 D8 98 u.

  • если L и k не указаны, то до ячейки, имеющей в том же сегменте, смещение равно S;
  • если S не указано, то показываются k ячеек памяти (в частности: D n L1 — одна ячейка памяти с вектор-адресом n);

1A8E:3B40 6C 6C 65 lle

  • если S и Lk не указаны (есть только D n), то отображаются 128 ячеек памяти, например:

1A8E:0400 69 6C 65-66 69 6C 65 66 69 6C 65 ilefilefile

1A8E:0410 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0420 00 44 CD 21 F6 C2 80 74-05 F6 C2 10 75 05 E8 52 .D. t. u..R

1A8E:0430 FD 8C DB 53 81 C3 2D 00-03 DA 8C CD 8B C2 80 E4 . S..-.

1A8E:0440 0F B1 04 8B F2 D3 E6 8B-CE D1 E9 4E 4E 8B FE 2B . NN..+

1A8E:0450 E8 2B D8 8E C5 8E DB F3-A5 FC 8E DD 07 06 BF 00 .+.

1A8E:0460 01 33 F6 AD 95 BA 10 00-EB 2B AD 95 B2 10 EB 35 .3. +. 5

1A8E:0470 AD 95 B2 10 EB 36 AD 95-B2 10 EB 3B AD 95 B2 10 . 6. ;.

1A8E:0480 EB 5D AD 95 B2 .].

Содержимое выводится в шестнадцатеричном коде и в соответствующих символах ASCII (символы расширенного набора ASCII замещаются точкой (.)).

  • E n “текст1“, “ текст2“. (enter) — изменение содержимого ячеек памяти, начиная с вектор адреса n; количество ячеек определяется размером и количеством указанных в команде текстов, так, по команде –e 200 ‘pole’, ‘файл’, ‘file’ выводится следующая информация:

1A8E:0200 70 6F 6C 65 E4 A0 A9 AB-66 69 6C 65 pole. file;

При вводе числовой информации (машинных кодов команд) следует набрать E n, нажать клавишу Enter, и после отображенного байта информации и точки ввести новое значение (1 байт), например:

Для ввода последующих байтов нужно нажать клавишу Space и выполнить ввод очередного байта.

  • F n Lk “текст1“ (fill) — заполнение блока памяти длиной k байт, начиная с вектор-адреса n, однобайтовыми фрагментами «текст1»: например, –f 400 L20 ‘file’.
Читайте также:
Что такое апробированная программа

Результат выполнения команды:

(Редактору. Все строчки без переносов).

1A8E:0400 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0410 66 69 6C 65 66 69 6C 65-66 69 6C 65 66 69 6C 65 filefilefilefile

1A8E:0420 00 44 CD 21 F6 C2 80 74-05 F6 C2 10 75 05 E8 52 .D. t. u..R

  • S n Lk“текст“ (search) — поиск фрагмента «текст» в поле памяти длиной k ячеек с выдачей вектор-адреса ячейки, хранящей искомый текст: –s 200 l10 ‘fi’.

Результат работы команды: 1A8E:0208.

  • W (write) — запись программы на диск; в регистр СХ должна быть предварительно указана длина программы в байтах, в регистр BX занесен нуль, а командой N задано имя файла (N имя_файла);
  • L (load) — загрузка файла с диска в ОП; предварительно следует в BX записать нуль, в регистр СХ записать длину файла в байтах и объявить его имя N; для стандартно оформленных COM- и EXE-программ это же можно выполнить, набрав debug имя_файла.
  • ввод всех числовых данных осуществляется в шестнадцатеричной системе счисления, текстов — в символах ASCII, помещенных в кавычки;
  • вектор-адрес имеет форму адрес сегмента:адрес смещения; адрес сегмента может быть определен в явном виде шестнадцатеричным кодом или указанием соответствующего сегментного регистра; сегмент команд может быть задан по умолчанию; адрес смещения описывается в явном виде шестнадцатеричным кодом. Примеры задания вектор-адреса: 4FC5:10B, 13C6:1ABB, DS:0, CS:100;
  • при вводе и отображении двухбайтовых слов старший байт размещается правее младшего. Пример: при отображении машинного кода команды mov AX, 0123 на экране получим: B82301 (B8 — код ‘mov ax’).

Источник: studfile.net

Отладчик

Отладчик — это мощный инструмент для проверки вашей игры, особенно полезный для поиска ошибок и багов в коде, а также для проверки того, что скрипты выполняются тогда, когда они должны выполняться, и что переменные и массивы содержат те ожидаемые значения и т.д.. Вы можете запустить отладчик, запустив свою игру из GameMaker IDE с помощью кнопки Debug в верхней части сайта IDE , или зайдя в меню Build и выбрав пункт «Debug».

ПРИМЕЧАНИЕ: Вам может быть предложено Windows Firewall (или любой другой программой брандмауэра, которую вы запускаете) создать исключение безопасности для этого модуля. Вы должны сделать это, иначе он не будет работать правильно. Это связано с тем, как работы отладчика и необходимо для отладки мобильных платформ.

Когда вы запускаете игру в режиме отладки, на сайте IDE будут отображаться различные инструменты, доступные для отладчика:

На изображении выше показана стандартная компоновка отладчика, но, как и в случае с другими аспектами IDE , вы можете настроить ее в соответствии со своими потребностями, закрыв окна, которые вам не нужны, или изменить размеры документов и окон, которые вам нужны. Вы можете в любой момент сбросить раскладку отладчика или снова открыть закрытые окна из контекстного меню отладчика в верхней части IDE:

Ниже мы объясним, для чего нужен каждый раздел отладчика:

Представление Graph показывает графическое отображение того, как ваш проект использует память и частоту кадров с течением времени:

График показывает текущее и среднее использование памяти, а также текущий и средний FPS с течением времени, и вы можете увеличивать или уменьшать масштаб, используя кнопки / вместе с колесиком мыши , а если вы наведете курсор мыши на любой из элементов графика, он покажет вам значение для этого элемента в выбранной точке.

В представлении Graph также отображаются определенные события отладки в виде точек по всей длине графика. Эти события автоматически генерируются GameMaker в определенные моменты работы игры, чтобы показать конкретные важные события, но вы также можете добавить свои собственные элементы графика с помощью функций show_debug_message() и debug_event() . Системные события будут отмечены другим цветом, чем события, вызванные кодом:

При запуске игры в режиме отладки и наведении курсора на эти события будет показан список всех событий, которые были вызваны в этот момент в игре, и у вас есть возможность вытащить список в отдельное окно для редактирования, нажав на текст «Нажмите, чтобы открыть в новом окне»:

Debug Icon

Вид ресурсов показывает список всех ресурсов, используемых в проекте, которые могут содержать код или действия GML Visual. Этот раздел работает аналогично Браузеру ресурсов, и вы можете развернуть элементы в нем, чтобы показать больше информации, например, различные события для определенного объекта. Затем вы можете дважды щелкнуть на любом из ресурсов, чтобы открыть код для него в представлении кода. код для него в окне Code View, где можно проверить значения, добавить или удалить точки останова.

В этом окне отображается текущий стек вызовов событий, а также номер строки, по которой выполняется код. Стек вызовов — это, по сути, структура данных «последний вошел — первый вышел», которая показывает порядок выполнения всего игрового кода как из программы GameMaker — поскольку отладка осуществляется с помощью Виртуальная машина (VM), — так и из того, что вы написали для игры. Отладчик должен быть быть приостановлен , прежде чем здесь появится какая-либо информация.

На панели инструментов находятся элементы управления отладчиком, а также основная информация, такая как использование памяти, текущий (реальный) FPS для игры и индикатор, показывающий, подключен ли отладчик в данный момент или нет (индикатор будет зеленым, если он подключен к работающему экземпляру вашего проекта, и красным в противном случае). к запущенному экземпляру вашего проекта и красным в противном случае). Доступными элементами управления являются:

Читайте также:
Программа где можно напеть мелодию и найти песню
Это позволяет запустить игру снова после того, как она была приостановлена (сочетание клавиш » f5 «).
Это приостановит (прервет) игру.
Перезапускает игру.
Останавливает игру.
Войдите в блок кода или сценарий (сочетание клавиш » f11 «).
MMB Icon Перейдите к блоку кода или сценарию (сочетание клавиш » f10 «).
Выйдите из блока кода или сценария (сочетание клавиш + » f11 «).
Включите или выключите обновление отладочной информации в реальном времени (по умолчанию выключено).

Первые три кнопки используются для управления игрой, позволяя вам в любой момент начать, приостановить, перезапустить или остановить ее. Когда игра приостановлена (либо нажатием кнопки Пауза или в точке останова), вы можете использовать три кнопки шагов для перехода по коду.

Когда мы говорим о «шаге» по коду, мы просто имеем в виду, что вы можете сказать своей игре выполнить текущую строку кода, а затем «шагнуть» к следующей, что позволит вам выполнить всю игру по одной строке кода за раз. если вы того пожелаете. Обычно для этого используется кнопка Step In, но у вас также есть кнопка для перехода по коду и кнопка для выхода из кода. Шаг за шагом полезен, когда когда нужно выполнить большой скрипт, так как при нажатии этой кнопки весь скрипт или блок кода будет выполнен за один шаг и остановится на следующей строке, в то время как шаг из кода выведет вас из скрипта (он будет выполняться, но весь сразу) и остановится на следующем шаге после изменения области действия. и остановится на следующем шаге после этого, когда область видимости изменится.

Последний значок обновления в реальном времени позволяет отладочному окну обновлять свои данные в реальном времени, так что вы можете видеть, как изменяются переменные или создаются и уничтожаются экземпляры, как это происходит. Обратите внимание, что это может повлиять на производительность игры и что не вся информация доступна в реальном времени. Например, часы состояния рендеринга (см. раздел » Часы») нельзя просматривать в реальном времени.

Представление кода — это место, где мы можем видеть и просматривать различные сценарии или код событий из нашего проекта по мере его выполнения. По умолчанию он начинается пустым, но вы можете дважды щелкнуть на любом активе из представления ресурсов , чтобы открыть его здесь. Вы можете открыть несколько различных событий или сценариев, и они будут добавлены в рабочую область представления кода в виде вкладок в верхней части.

Когда любое окно кода открыто в представлении кода, вы можете щелкнуть левой кнопкой мыши в желобе (где находятся номера строк), чтобы добавить или удалить точки останова (см. далее на этой странице информацию о точках останова).

Вы также можете использовать правую кнопку мыши , чтобы открыть Контекстное меню, которое также позволяет добавлять или удалять точки останова и копировать любой выделенный код в буфер обмена.

Этот раздел посвящен «наблюдению» за различными аспектами вашей игры для более глубокой и детальной отладки. Подробно об этом рассказывается на следующей странице:

Важно отметить, что во время работы игры она по умолчанию не обновляет значения переменных и другие данные в окнах отладки, поэтому сначала необходимо либо использовать кнопку Pause в отладчике, чтобы приостановить игру до того, как станут доступны локали, глобали и другие данные, либо включить обновление в реальном времени с помощью иконок в верхней части экрана . Единственным Единственным исключением из этого правила является вид профиля , который обновляется в реальном времени при включении независимо от переключателя реального времени, так как у него есть своя собственная кнопка включения/выключения. Полную информацию об этом представлении вы можете найти на следующей странице:

Еще одной важной частью отладки игры является использование точек останова. Точка останова — это место в коде вашего проекта, которое вы хотите остановить, чтобы вы могли видеть, что происходит. При запущенном отладчике вы можете добавлять или удалять точки останова в любое время и в любом блоке кода или сценария, щелкнув левой кнопкой мыши на в желобе (где находятся номера строк), или вы можете использовать правую кнопку мыши. чтобы открыть Контекстное меню, которое также позволяет добавлять и удалять точки останова:

Точки останова также могут быть установлены из GameMaker IDE . При написании проекта они могут быть добавлены или удалены в любое время с помощью команды f9 (или с помощью правой кнопки мыши и выбора «toggle breakpoint»), либо на действие в окне объекта (для пользователей GML Visual), либо на строке в окне редактора кода. Теперь, когда вы запускаете свою игру в режиме отладки, она будет приостанавливаться в точке (или точках), которую вы определили.

Точки останова, установленные на сайте IDE , сохраняются вместе с проектом и сохраняются при различных запусках, пока не будут удалены. Однако если вы добавите точку останова в код в отладчике, она будет потеряна после закрытия модуля или начала нового запуска теста. Обратите внимание, что все точки останова отображаются в окне вывода, где их можно включить, отключить или даже удалить.

Источник: manual-ru.yoyogames.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru