forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Отладка (http://forum.boolean.name/showthread.php?t=35)

impersonalis 04.09.2005 23:00

Отладка
aka DEBUG
Пример 1:
Допустим у нас есть бажный кусок кода:
:bad:
Код:

Graphics3D 800,600,32
SetBuffer BackBuffer()

image=LoadImage("")
DrawImage image,0,0

End

С отключённым отладочным режимом ничего кроме сообщения об ошибке вы не увидите.
Включаем отладку.


impersonalis 04.09.2005 23:02

запускаем на выполнение.
Как видно в окне отладчика


выполнение программы было прервано на строке
Код:

DrawImage image,0,0
Единственное, что приходит на ум - картинка не может быть отображена из-за ошибки
загрузки. О чём, вообще-то, нам и сообщает текст форточки с ошибкой. Проверим значение
хендла image:



Как видно он равен 0. Что и требовалось доказать.

impersonalis 04.09.2005 23:03

Пример2:
Допустим есть другой бажный кусок кода:
:bad:
Код:

For i=1 To 10
        i=i-1
Next

Простенький цикл выполняется подозрительно долго...
нажмем кнопку



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

impersonalis 04.09.2005 23:04

Также могут понадобиться кнопки:



1 - вернуться к стандартному выполнению программы
2 - следующий шаг
3 - войти в блок команд (например, в функцию)
4 - выйти из блока
5 - завершение программы

impersonalis 04.09.2005 23:06

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

Stop
Если интерпретатор наткнётся на эту команду он автоматически перейдёт в режим отладки. только у меня (и не только) эта команда сбоит.
Код:

DebugLog message
Позволяет добавить команду в DebugLog, который можно просмотреть, выбрав соответствующую
вкладку на панели отладчика.


impersonalis 11.01.2006 04:17

см. также

ZanoZa 12.01.2006 10:32

Код:

Graphics 800,600,16,2
.start
x=1
Repeat
Cls
x=x+1
x=y^2
Goto start
Text 10,10,x
Flip
Until KeyHit(1)
End

с debug enabled комп тормозит.
Если отключить комп зависает(у меня) примерно на минут 10 + компьютор жалобно писчит, и курсор застывает на месте!

AsmLover 12.01.2006 14:34

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

Graphics 800,600,16,2
.start
x=1
Repeat
  Cls
  x=x+1
  x=y^2
  Goto start
Forever

Я просто добавил комплементарную пару к Repeat (т.е. Forever), чтобы программа работала.
Крайне редко бывает смысл входить в бесконечный цикл без возможности выхода из него. В данном случае смысла нет никакого, поэтому добавим возможность в теле бесконечного цикла выход пор нажатию клавиши ESC:
Код:

Graphics 800,600,16,2
.start
x=1
Repeat
  Cls
  x=x+1
  x=y^2
  If KeyHit(1) End
  Goto start
Forever

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

Пара замечаний по коду г-на Zanoza.
На Ассемблере такие конструкции встречаются очень часто. Но на языках высокого уровня их надо избегать, если Вы не представляете точно, чего хотите добиться от программы. Если необходимо программным способом выйти из цикла или блока, то в Блитце есть специальная команда EXIT, корректно выводящая на верхний уровень вложенности (то есть если у Вас три вложенных цикла, например, то для выхода в основное тело программы нужно использовать EXIT в каждом цикле). Это связано с тем, что можно попасть в ситуацию, когда итоговый ассемблерный код цикла реализован не c помощью метки входа и команд условного или безусловного перехода на эту метку, а через запоминание на стеке адреса первой команды после цикла и перехода на него командой возврата после завершения работы цикла, восстанавливающей исходное состояние стека. В последнем случае при выходе из тела цикла из его середины на стеке останется лишнее значение, что наверняка приведет к краху программы.

Но поскольку в исходном коде пересекаются два цикла :
.start .... GOTO start и
Repeat .... Until KeyHit(1),

то пришлось бы использовать Exit два раза. Проще в данном случае включить проверку на нажати ESC перед входом в цикл.

Поэтому свой очень полезный код г-н Zanoza должен был написать так:

Код:

Graphics 800,600,16,2
.start

x=1

While Not KeyHit(1)
  Cls
  x=x+1
  x=y^2
  Goto start
  Text 10,10,x
  Flip
Wend

End

Разумеется, и в этом случае команды после Goto никогда не выполнятся (слава Богу, автор не так много кода сгенерировал после этого - спасибо за это).

Guest 12.01.2006 14:39

P.S. Соврал :)) , выполнится команда Еnd при нажатии на ESC. Впрочем, ее можно спокойно удалить.

ZanoZa 12.01.2006 18:04

Нет, у меня действительно зависит от отладчика.При включенном debuge не зависает.
А пример я специально кривой написал.

jimon 12.01.2006 23:31

у меня почемуто мнение что надо компилировать в стандартном ide без отладчика и с отладчиком... и попробовать скомпилировать в visual blitz

я когда писал декомпилятор для блица - заметил прикол
можете сами даже посмотреть, если компилить стандартным ide, просто компилить... не в exe... а просто так :) F5 нажать... то ЧАСТИЧНО код переносится в процесс который якобы емулирует запуск exe

в visual ide такого нету ...

тоесть в блице - запустить через F5 и через exe - две разные вещи...


Часовой пояс GMT +4, время: 08:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot