30. Как отлаживать программу Go с помощью GDB?

Go

Привет всем, меня зовут Мин.

В период самостоятельного изучения Golang я написал подробные учебные заметки и разместил их в своем личном общедоступном аккаунте WeChat «Время программирования на Go».Что касается языка Go, я тоже новичок, поэтому то, что я написал, должно больше подходить для новых студентов, если вы только изучаете язык Go, вам стоит обратить на него внимание, учиться и расти вместе.

Мой онлайн-блог:golang.iswbm.comМой Github: github.com/iswbm/GolangCodingTime


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

Если вы используете VS Code или Goland, вы можете сразу приступить к работе, и я больше не буду писать об этом статьи.

На самом деле я предпочитаю простую и прямую отладку из командной строки инструментам отладки IDE с пользовательским интерфейсом по трем причинам:

  1. Скорость высокая, и я лично считаю, что под Windows скорость очень низкая.
  2. Меньше зависимостей, простота отладки на серверах Linux
  3. Инструкции просты, я привык использовать только горячие клавиши для работы

Если у вас такие же чувства и привычки, как у меня, вы можете прочитать сегодняшнюю статью, в которой представлен инструмент отладки GDB.

1. Скачайте и установите Go

Отладка в Linux, поэтому мы должны сначала установить Go, потому что в первом разделе говорится только о загрузке и установке Windows, а не о том, как установить его в Linux. Итак, давайте сначала поговорим об этом, он был установлен, и вы можете пропустить его напрямую.

Сначала на странице загрузки (golang.org/dl/), просмотрите и скопируйте исходный код...

Войдите в систему с Linux и используйте wget для загрузки

$ wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz

Разархивируйте загруженный исходный пакет в/usr/localкаталог и установить переменные среды

[root@localhost ~]# tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
[root@localhost ~]# 
[root@localhost ~]# export PATH=$PATH:/usr/local/go/bin
[root@localhost ~]# which go
/usr/local/go/bin/go
[root@localhost ~]# 
[root@localhost ~]# go version
go version go1.14.2 linux/amd64
[root@localhost ~]# 

2. Начать отладку

Для отладки используется GDB (похоже, требуется версия 7.1+), перед использованием убедитесь, что GDB установлен на вашем компьютере.

[root@localhost code]# which gdb
/usr/bin/gdb

Когда будете готовы, сначала напишите тестовый файл в каталоге

package main

import "fmt"

func main(){
  msg := "hello, world"
  fmt.Println(msg)
}

Затем выполните следующую команду для компиляции, в ней много параметров, если у вас есть какие-либо вопросы, вы можете самостоятельно поискать движок

# 关闭内联优化,方便调试
$ go build -gcflags "-N -l" demo.go

# 发布版本删除调试符号
go build -ldflags “-s -w”

Наконец, используйте команду GDB для входа в интерфейс отладки.

# 如果你喜欢这种界面的话,用这条命令
$ gdb -tui demo

# 如果你跟我一样不喜欢不习惯用界面,就使用这个命令
$ gdb demo

Полная операция выглядит следующим образом:

После входа в интерфейс отладки GDB он сразу не доступен, нужно сначала нажать Enter, а потом набрать несколько строк команд, и код появится в окне отладки.

(gdb) b    main.main   # 在 main 包里的 main 函数 加断点
Breakpoint 1 at    0x4915c0: file /home/wangbm/code/demo.go, line 5.
(gdb) run  # 执行进程
Starting program: /home/wangbm/code/demo 
Breakpoint 1, main.main () at /home/wangbm/code/demo.go:5
(gdb) 

3. Подробные инструкции по отладке

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

  • r: запустить, выполнить программу

  • n: следующий, следующий шаг, не входить в функцию

  • s: шаг, следующий шаг, войдет в функцию

  • b:breakponit, поставь точку останова

  • l:list, просмотреть исходный код

  • c: continue, продолжить выполнение до следующей точки останова

  • bt:backtrace, просмотреть текущий стек вызовов

  • p: печать, переменные представления печати

  • q: выйти, выйти из GDB

  • whatis: вид объекта

  • info breakpoints: просмотреть все точки останова

  • info locals: просмотр локальных переменных

  • info args: просмотр значения параметра функции и возвращаемого значения переменной.

  • info frame: информация о кадре стека

  • info goroutines: просмотр информации о горутинах. Перед его использованием необходимо обратить внимание на выполнение исходного кода /usr/local/go/src/runtime/runtime-gdb.py.

  • goroutine 1 bt: просмотреть стек вызовов горутины с указанным порядковым номером.

  • Enter: повторить последнюю операцию

Некоторые из них более гибкие в использовании.

Например l - список, см. код

# 查看指定行数上下5行
(gdb) l 8

# 查看指定范围的行数
(gdb) l 5:8

# 查看指定文件的行数上下5行
l demo.go:8

# 可以查看函数,记得加包名
l main.main

поставить вышеlзаменитьb, большинство также применимо

# 在指定行打断点
(gdb) b 8


# 在指定指定文件的行打断点
b demo.go:8

# 在指定函数打断点,记得加包名
b main.main

Также есть p - print, который печатает переменные

# 查看变量
(gdb) p var

# 查看对象长度或容量
(gdb) p $len(var)
(gdb) p $cap(var)

# 查看对象的动态类型
(gdb) p $dtype(var)
(gdb) iface var

# 举例如下
(gdb) p i
$4 = {str = "cbb"}
(gdb) whatis i
type = regexp.input
(gdb) p $dtype(i)
$26 = (struct regexp.inputBytes *) 0xf8400b4930
(gdb) iface i
regexp.input: struct regexp.inputBytes *

Выше было сказано об использовании GDB.Это очень просто.Вы можете вручную напечатать и испытать его на себе.

Справочная статья