Что нового

Отладка кода

Prog

Осваивающий
Сообщения
432
Репутация
49
Народ, кто и как отлаживает программы? Нужна возможность в любой момент остановки скрипта, пошаговое выполнение кода, стек вывозов, просмотр всех глобальных переменных/массивов и локальных (в пределах стека вызовов). В случае ошибки скрипта, необходимо получить стек вызовов и данные из интересующих переменных (какие заранее неизвестно и выяснится походу изучения причины ошибки).
Пробовал этот отладчик. Он виснет при запуске скрипта. В чем причина неизвестно.
Этот работает но функционал очень скромный. Стека вызовов нет. Нет возможности изучать переменные/массивы которые могут хранить вложенные массивы. При ошибке скприта, отладчик завершаетсмя вместе с ним. То есть отладчик не отладчик вовсе и для меня бесполезен...

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

joiner

Модератор
Локальный модератор
Сообщения
3,461
Репутация
609
На форуме есть темы по отладчикам. Например
Но так или иначе придется доделывать или переделывать
 
  • Like
Реакции: Oki

Oki

Осваивающий
Сообщения
169
Репутация
20
Нужна возможность в любой момент остановки скрипта

просмотр всех глобальных переменных
Эти два вопроса иногда решаю вот таким сочинённым на коленке топорным методом, который пусть и не очень удобен в сравнении с нормальными трассировщиками, но всё-таки бывает весьма полезен.
Код:
HotKeySet("{F11}", "DebugWatch")
Func DebugWatch()
   $sExpression = ""
   $sExpressionResult = ""
   Do
      $sExpression = InputBox("Debug Watch", $sExpression & " = " & $sExpressionResult & ". Input the next expression to watch or press <Enter> to exit Debug Watch.")
      $sExpressionResult = Execute($sExpression)
   Until $sExpression = ""
EndFunc
Можно кинуть этот код в отдельный au3-файл и подключать include'ом в одну строку. При желании можно доработать для выдачи по команде массивов полностью (а не по одному элементу вручную) и даже выводить номер исполняемой строки скрипта, но последнее, как мне видится, потребует написания специального скрипта для трансляции задаваемого скрипта в производный от него расширенный скрипт (подобным образом даже можно пошаговое выполнение обеспечить), собирающий информацию о выполнении в выделенные для этого переменные. Голь на выдумки хитра, а разработчики языка и языковых сред имеют собственные приоритеты.
 
Последнее редактирование:
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
Это не самый удобный и продуктивный вид отладки...
 

Oki

Осваивающий
Сообщения
169
Репутация
20
Это не самый удобный и продуктивный вид отладки...
Самый удобный и продуктивный, к сожалению, стандартными средствами не предоставляется. Остаётся лишь искать ходы наподобие предложенных (не только в этом топике, но и в других по этому вопросу).
 

AZJIO

Меценат
Меценат
Сообщения
2,801
Репутация
1,164

Prog

Так как я изначально изучал AutoIt3 то привык к его методу отладки. Если мне надо вывести переменные я просто вставляю мессагу или в консоль, но обычно в мессагу. Для упрощения этого метода написал скрипт, который выделив например 3 переменных в коде в Notepad++, вызываю хоткей, скрипт парсит имена переменных в выделенном коде, получаю диалог в каком виде сделать вывод мессага/консоль по умолчанию отмечено любимое, жму Enter, Ctrl+V, F5, всё. Ещё был неприжившийся вариант функция "z", легко запомнить, ввёл z, переменную в скобках, всё (ну там были флаги мессага/консоль/файл/подсказка, автоопределение типа данных, запрет вывода). Неприжился, так как требовал вставлять #include, а тестировать приходилось активно мелкие скрипты.

Иные способы пошагового я пока не понимаю в PureBasic, если мне надо тестировать какую то вещь, то зачем мне 20 переменных и смотреть их ещё и на каждом шаге цикле, 20 штук смотреть 1000 раз, я пока не понимаю смысл этого действа. Если AutoIt3 говорит что превышен индекс массива я направляю логику на понимание причин превышения индекса. Если переменные имеют не ожидаемые данные, то делаю вывод тех переменных которые предположительно сбоят, делю код на блоки, проверяю на законченных участках кода вывод переменных. Сам AutoIt3 ни разу не подводил, что смотреть в стеках не знаю. Но если у вас чужой нерабочий огромный код, это наверно самое худшее, если код неправильно написан, там можно бесконечно тестировать.
 

Вложения

  • debugger.png
    debugger.png
    31.4 КБ · Просмотры: 8
Последнее редактирование:
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
Если мне надо вывести переменные я просто вставляю мессагу или в консоль, но обычно в мессагу.
Неэффективно по времени и затрачиваемым усилиям. Не всегда заранее известно где смотреть.
Классический случай - программа падает в одной из функций сообщая об ошибке, судя по которой проблема не в коде функции, а в некорректных данных переданных через аргументы. Код большой и функция вызывается из 1500 мест и нужно узнать откуда вызвана перед ошибкой. Перезапуск кода нежелателен т. к. ошибка может быть редкой и на нее повторение уйдет много времени.
Что вы сделаете в такой ситуации?

если мне надо тестировать какую то вещь, то зачем мне 20 переменных и смотреть их ещё и на каждом шаге цикле
Нужно смотреть не все, а только те что интересуют и не постоянно, а при необходимости. Важно то что заранее точно неизвестно что смотреть и выяснится по мере изучения причины ошибки. То есть доступ к просмотру должен быть для всех переменных, а какие смотреть выяснится по ходу дела.

Если переменные имеют не ожидаемые данные, то делаю вывод тех переменных которые предположительно сбоят
Это предполагает перезапуск скритпа. Интересующий участок кода может быть выполнен не сразу и при определенных обстоятельствах, а это огромная потеря времени и сил.

Но если у вас чужой нерабочий огромный код, это наверно самое худшее, если код неправильно написан, там можно бесконечно тестировать.
В коде слишком много вложенных массивов. "Магические числа" в индексах типа
Код:
$Data[$i][28]=$x
Вот пойми что такое 28 и что хранится в ячейке массива. И в таком стиле весь код.
 
Последнее редактирование:

Glass4217

Осваивающий
Сообщения
267
Репутация
47
Писать лог, максимально подробный, в процессе подготовки изделия к выпуску пусть будет хоть с гигабайт размером.
Я не программист, только учусь и то за 10 лет изучения Autoit я только начинаю вникать в детали, но как только у меня возникают подозрения что что-то может пойти не так, я включаю максимальное количество записей в консоль, либо всё включая переменные используемые сейчас в функции пишу в лог.
таким образом я понимаю что где и в какой момент сломалось.
Про эффективность и скорость разработки да можно забыть, так как порой циклы идут тысячами для каждой переменной.
С другой стороны можно ведь контролировать какого типа переменная поступает из массива: строка, число, еще массив, все можно проверять и реагировать соответственно, больше проверок богу проверок.
Ну и самое главное чтобы не путаться в своем же коде, максимальное количество комментариев, даже для простого "send" максимально подробное описание.
К сожалению я не обладаю высокими познаниями и скорее всего мой комментарий просто не уместен, с другой стороны, возможно его прочтет другой участник форума которому данный совет поможет развиваться продуктивней чем мне.
 
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
Про эффективность и скорость разработки да можно забыть, так как порой циклы идут тысячами для каждой переменной.
Это неприемлемо! Я не могу себе позволить месяц возится с кодом где хватило бы нескольких вечеров при наличии нормального отладчика!
 

Glass4217

Осваивающий
Сообщения
267
Репутация
47
А контроль переменных? да согласен усложнение кода, но ведь можно встроить проверку ожидаемого значения переменной.
 
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
но ведь можно встроить проверку ожидаемого значения переменной.
Код (не один а множество) написан не мной. Содержит много тысяч строк. Чтобы добавить проверку нужно понимать что ожидать, а для этого нужно весь код перелопатить и все тщательно задокументировать потратив много времени и сил. Оно того стоит?
 

Glass4217

Осваивающий
Сообщения
267
Репутация
47
100% того стоит, по крайней мере в моем случае, я изучаю всё и вся. чтобы понять по какому принципу построена логика. если я не понимаю почему функция или команда выполняется именно так из за сложности или особенности построения. я изучаю этот кусок кода, перенеся его в отдельный "микропроект" и продую разные комбинации чтобы понять что ожидать.
Мой подход не всем подходит... я стараюсь сделать(в ущерб времени разработки) и забыть до тех пор пор пока не появится какое-то изменение во входящих данных.
 

InnI

AutoIT Гуру
Сообщения
4,719
Репутация
1,351
Содержит много тысяч строк.
Язык не виноват в том, что его использовали не по назначению. Архитектура AutoIt не подразумевает создание больших и сложных программ. И это понятно на этапе изучения. Ну сложно вам справиться с чужим кодом, ну откажитесь от работы. Или запросите больше времени. Зачем язык ругать?

По поводу отладки.
В полной версии SciTE в меню Tools есть некоторые способы отладки и трассировки (Debug*, Trace*, DebugTrace*).
У Wrapper'а есть опция отладки (меню Help - SciTE Help)
Код:
#AutoIt3Wrapper_Run_Debug_Mode=

Попробуйте. Может хоть что-то из этого как-то облегчит вашу работу.
 

AZJIO

Меценат
Меценат
Сообщения
2,801
Репутация
1,164

Prog

Вы пишете что вам нужно пошаговый вывод и одновременно говорите, что код может сбойнуть раз в 4 часа. Я понимаю что отладчик не предупредит вас за 10 шагов, что прога сейчас упадёт я удерживаю её для вас для просмотра переменных. Скорее всего когда прога упадёт у вас останется лог переменных, при это программа должна быть запущена в отладчике. И я не исключаю, что момент падения произойдёт не в момент получения неверных данных, а в момент использования, а на каком этапе конвейера были получены неверные данные вам опять останется неизвестным. Надо смотреть конкретный случай, обычно по догадкам можно определить момент падения, например файл недокачан, окно для автоматизации не появилось и кстати если окно не появилось то смотреть переменные не имеет смысла, если не предусмотрено ожидание окна. Код большой? Можно автоматизировать вывод в файл лога, например в начале каждой функции регулярным выражением после объявления переменных вставить вывод входных данных. Можно после каждой строки вставить вывод данных, отправить исходник в массив построчно и начать объединение перед этим к каждой строки добавить строку записи в файл переменных находящихся в строке, благо их легко определить по наличию $ в конце латинских букв. Но так как я сам не считаю это решением, я бы не стал делать такой отладчик, может в будущем я бы изменил мнение, но сейчас метод полностью основанный на методе тыка не уверен что сработает. Если код изначально не логичен, а автор всегда надеялся на волшебство, то тыкать в нём можно бесконечно пока не приведёт к изучению и пониманию нелогичности кода.
 
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
Вы пишете что вам нужно пошаговый вывод
Мне нужен нормальный отладчик. Пошаговое выполнение это одна из его функций. В чистом виде редко используется и на небольших участках кода.

Я понимаю что отладчик не предупредит вас за 10 шагов, что прога сейчас упадёт я удерживаю её для вас для просмотра переменных.
То что произошел сбой вовсе не мешает просмотреть что в переменных.
Сделал gif-ку на примере PB. Отладчик в нем не самый лучший (в MS студии гораздо функциональнее и удобнее), но даже такой лучше чем его отсутствие.
DebugPB.gif
На этой анимации видно что отладчик отображает историю (последовательность) вызовов процедур и их локальные переменные. Это позволит гораздо быстрее определить причину ошибки и ее локализацию чем добавляя отладочный вывод в консоль и перезапуская программу.

Если код изначально не логичен, а автор всегда надеялся на волшебство
Код нормальный и написан исходя из возможностей AutoIt, а именно наличия только переменных и массивов. Из-за этого автору пришлось использовать массивы там где логичнее применить связный список структур с вложенными массивами и списками. Повсеместный Variant не добавляет читаемости коду.
Из-за этого код сложно поддерживать.
 

AZJIO

Меценат
Меценат
Сообщения
2,801
Репутация
1,164
Архитектура AutoIt не подразумевает создание больших и сложных программ
А что под этим имеется ввиду? Интерпретатор не может прочитать исходник если его размер превышает некоторую величину? Просто я думаю причина по которой люди не пишут сложные программы такие как фотошоп является не в том что это невозможно, а в том что пользователь получив такой уровень знаний на определённом этапе понимает, что ему нужно не готовые функции, а он может сам написать функцию которая будет более точно действовать, то есть вы не летите на самолёте в магазин, так и программер выполняя обработку данных понимает, что данный способ выполняют кучу бесполезных действий которые можно написать по-другому, более целенаправлено под конкретную задачу и естественно переходит на язык который позволяет это.
Сообщение автоматически объединено:

Сделал gif-ку на примере PB
Пётр показывал давно такой же пример, я в курсе, тоже пробовал и пока понял что я не понимаю этот способ и что он не панацея.
где логичнее применить связный список структур
работая с двумя способами я пока не понимаю в чём разница. Можно представить что в обоих способах это ячейка данных, некая таблица в которой у вас есть доступ по оси Х и Y. Вы понимаете так же как в PureBasic задав имя поля структуры например "ID", так же и я ранее в AutoIt3 сверху над объявлением двумерного массива с 10-ю колонками подписывал что хранится в каждой колонке (идентификатор, размеры кнопки, текст кнопки и т.д.), в таком осознании у вас не должно быть непонимания, кроме выдуманного. Другое дело прога заполнявшая массив в цикле вдруг выдала невалидные данных, так она и в PureBasic может выдать вам такие же невалидные данные в структуру. В чём отличие то?

Вы можете регулярным выражением навсталять строки отладки и также регулярным выражением вырезать их. Создать копию исходника для отладки и мучить, а потом исправить оригинал.
 
Последнее редактирование:
Автор
P

Prog

Осваивающий
Сообщения
432
Репутация
49
работая с двумя способами я пока не понимаю в чём разница.
Кусочек кода на AutoIt.
Код:
$Data[100][10]
Тоже на PB со структурой.
Код:
Structure ProgramVariable
  List WindowTitle.s()
  List ProcessName.s()
  List ProcessPid.i()
  Counter.l
  CurrentTime.l
EndStructure

Dim Data.ProgramVariable(100)
Какой вариант нагляднее, этот
Код:
$x = $Data[28][4]
или этот
Код:
x = Data(28)\CurrentTime

Можно представить что в обоих способах это ячейка данных, некая таблица в которой у вас есть доступ по оси Х и Y.
Отличие в наглядности и удобстве работы с кодом. Если я смотрю на код и вижу $x = $Data[28][4] как я узнаю что по индексу 4, особенно если в коде нет пояснений? Даже если есть в объявлении массива, нужно помнить номера всех индексов всех массивов и что в них.

Вы понимаете так же как в PureBasic задав имя поля структуры например "ID"
Изучая код я читаю название поля CurrentTime и понимаю что в нем хранится текущее время, а о чем мне скажет число 4 в индексе массива?

так же и я ранее в AutoIt3 сверху над объявлением двумерного массива с 10-ю колонками подписывал что хранится в каждой колонке (идентификатор, размеры кнопки, текст кнопки и т.д.), в таком осознании у вас не должно быть непонимания, кроме выдуманного.
В коде несколько подобных массивов. Мне приходится работать с десятком кодов написанных не мной... Предлагаете наизусть выучить что означают числовые индексы каждого массива всех кодов?
Вместо того чтобы сосредоточится на доработке участка кода, я изучаю его вдоль и поперек пытаясь понять что в массиве... А если что-то идет не так, вместо того чтобы запустить код под отладчиком и быстро найти причину, приходится долго и нудно вставлять вывод в консоль в предполагаемых местах сбоя.
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,801
Репутация
1,164

Prog

Как вариант можно открыть 2 окна редактирования в AkelPad или Notepad++, в левой части код, в правой подсказки. Авторы AutoIt3 понятно что не будут срочно делать отладчик, остаётся найти способ выхода из этих положений. Посмотрите мои сборки (AkelPad и Notepad++), может вам будут интересны какие либо из инструментов, учитывая что я подстраивал их для работы AutoIt3 и PureBasic.
 

InnI

AutoIT Гуру
Сообщения
4,719
Репутация
1,351
А что под этим имеется ввиду?
Именно это - не подразумевает. То есть никто не запрещает написать на AutoIt аналог Excel, но, как вы сами понимаете, никто за это не возьмётся. А если кто и решит совершить такой подвиг, то он сразу упрётся в скорость работы. Потом ему понадобится многопоточность. Затем всё то, о чём писал @Prog - структуры, списки и, возможно, даже ООП. Да и без отладчика, конечно, будет очень сложно.
 

AZJIO

Меценат
Меценат
Сообщения
2,801
Репутация
1,164

InnI

Python - интерпретируемый язык и он активно используется в Linux и на нём написаны крупные проекты (GIMP, BitTorrent ).
 
Верх