День 09 — глубже
Всё здесь необязательно. Материалы на английском помечены.
Delve (англ.)
- Getting started — https://github.com/go-delve/delve/blob/master/Documentation/cli/getting_started.md Первый запуск
dlv debug,dlv execиdlv test. Последний понадобится в блоке 3, когда появятся тесты. - Справочник команд — https://github.com/go-delve/delve/blob/master/Documentation/cli/README.md Все команды
dlvс ключами. Тот же текст —helpиhelp командапрямо в приглашении(dlv). - Выражения — https://github.com/go-delve/delve/blob/master/Documentation/cli/expr.md Что можно писать после
printи вcondition. - Условия на точках — https://github.com/go-delve/delve/blob/master/Documentation/cli/cond.md
VS Code (англ.)
- Debugging Go code — https://github.com/golang/vscode-go/blob/master/docs/debugging.md Все поля
launch.jsonрасширения Go, в том числеconsole,args,cwd.
Про методику (англ.)
- Julia Evans, A debugging manifesto — https://jvns.ca/blog/2022/12/08/a-debugging-manifesto/ Короткий список правил отладки: изучать систему, а не угадывать, и проверять одно предположение за раз.
- David Agans, книга Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems. Девять правил, два из них — «воспроизведите» и «меняйте одно за раз».
Мини-опыты
Все — на оригинальной priemka: cp ~/.course/orig/day09/priemka/main.go ~/gocourse/day09/priemka/.
- Невидимое в файле.
cat -A input.txtпоказывает конец каждой строки знаком$. Найдите строку, где перед$стоит пробел. Чем этот способ хуже%q, если строк десять тысяч? - Условие по счёту остановок. В
dlv: точка на строке 25,condition -hitcount 1 == 7,continue,print i. Почемуiне равно 7? Подсказка: пустая строка и строка с пробелом до строки 25 не доходят. - Выражения в print. На любой остановке внутри цикла:
print total * 2,print line == "14 ",print len(line). Что можно спросить у отладчика, не меняя программу? - Другой ввод без выхода. Сделайте файл
small.txtиз двух строк. В сеансеdlvнаберитеrestart <small.txt— справкаhelp restartописывает эту запись. Ввод из-rпри этом заменяется. - Код вокруг.
listна остановке показывает код вокруг текущей строки,list main.go:1— начало файла. Удобно, когда экран уехал. - Сборка без ускорений. Соберите
go build -gcflags='all=-N -l'и запуститеdlv exec ./priemka -r input.txt, точка на строке 25. Появится лиWarning: debugging optimized function? Сравните с обычнымgo build.