- PVSM.RU - https://www.pvsm.ru -
Нижесказанное относится к инструментарию gc
. Gccgo имеет встроенную поддержку gdb. Помимо этого обзора Вы можете консультироваться с руководством по GDB [1].
Когда Вы компилируете и компонуете ваши Go программы с помощью инструментария gc в Linux, Mac OS X или FreeBSD, полученный в результате бинарные файлы содержат отладочную информацию DWARFv3, которую отладчик GDB последней версии (>7.1) может использовать для исследования живого процесса или дампа.
Чтобы опустить отладочную информацию передайте флаг '-s'
компоновщику (например, go build -ldflags "-s" prog.go
).
Код, генерируемый компилятором gc, включает встраивание вызовов функций и регистеризацию переменных. Эти оптимизации иногда могут сделать отладку с помощью GDB сложнее. Чтобы отключить их на время отладки, передайте флаг -gcflags "-N -l"
команде go
[2], которая используется для сборки отлаживаемого кода.
(gdb) list
(gdb) list line
(gdb) list file.go:line
(gdb) break line
(gdb) break file.go:line
(gdb) disas
(gdb) bt
(gdb) frame n
(gdb) info locals
(gdb) info args
(gdb) p variable
(gdb) whatis variable
(gdb) info variables regexp
Новый механизм расширений GDB позволяет загружать скрипты расширений для заданного двоичного файла. Инструментарий использует этот факт, для того чтобы расширить GDB небольшим числом команд, позволяющих исследовать внутренности исполняемого кода (такие как горутины) и красиво отображать встроенные типы словарей, срезов и каналов.
(gdb) p var
(gdb) p $len(var)
(gdb) p $dtype(var)
(gdb) iface var
Известная проблема: GDB не может автоматически находить динамический тип значения интефейса, если его длинно имя отличается от короткого (раздражает, когда выводится трассировка стека, вместо красивого отображения мы получаем короткое имя типа и указатель).
(gdb) info goroutines
(gdb) goroutine n cmd
(gdb) help goroutine
Например:
(gdb) goroutine 12 bt
Если Вы хотите узнать как скрипт расширения работает или хотите расширить его, посмотрите src/pkg/runtime/runtime-gdb.py [3] в директории исходных кодов Go. Он зависит от нескольких специальных магических типов (hash<T,U>
) и переменных (runtime.m
и runtime.g
), описание которых в DWARF коде обеспечивает компоновщик (src/cmd/ld/dwarf.c [4]).
Если Вам интересно как выглядит отладочная информация, запустите 'objdump -W 6.out
' и просмотрите секции .debug_*
.
"fmt.Print"
в качестве неструктурированного литерала с "."
, который должен быть помещен в кавычки. Это еще более относится именам методов pkg.(*MyType).Meth
.main
.Автор: obyknovenius
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/perevod/34031
Ссылки в тексте:
[1] руководством по GDB: http://sourceware.org/gdb/current/onlinedocs/gdb/
[2] go
: http://golang.org/cmd/go
[3] src/pkg/runtime/runtime-gdb.py: http://golang.org/src/pkg/runtime/runtime-gdb.py
[4] src/cmd/ld/dwarf.c: http://golang.org/src/cmd/ld/dwarf.c
[5] Источник: http://habrahabr.ru/post/179317/
Нажмите здесь для печати.