首先安装工具gdb,可以

brew install gdb

也可以源码安装

http://ftp.gnu.org/gnu/gdb/

tar -zxvf gdb-8.0.1.tar.gz
cd gdb-8.0.1
./configure
mkdir build
cd build
../configure
make
make install

8.0.1编译错误,网上这个说法

gdb 8.1 is incompatible with macOS 10.13. Downgrade to gdb 8.0.1 instead

https://sourceware.org/gdb/wiki/PermissionsDarwin

http://ftp.gnu.org/gnu/gdb/gdb-8.0.1.tar.gz

对mac 10.15.是不ok的,9.2可以编译通过

一段简单的源码开始

package main


import "fmt"


func main() {
a := 1
b := 2
fmt.Println(a + b)
}


编译,保留调试信息,去除内联优化

go build -o main -gcflags="-N -l" main.go 

然后开始调试

gdb main

如果报错

Unable to find Mach task port for process-id 47072: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))

是权限不够

sudo gdb main

或者给gdb创建证书,具体步骤参考

https://blog.roy4801.tw/2020/01/27/%E5%9C%A8-macOS-Mojave-%E4%B8%8A%E6%AD%A3%E5%B8%B8%E4%BD%BF%E7%94%A8-gdb/

在钥匙串中生成证书

which gdb
/usr/local/bin/gdb
cd /usr/local/bin/
vi gdb.xml
codesign --entitlements gdb.xml -fs gdb-cert ./gdb
codesign -d --entitlements - $(which gdb)

如果遇到

[New Thread 0xe03 of process 51333]
[New Thread 0x1203 of process 51333]
During startup program terminated with signal SIGTRAP, Trace/breakpoint trap.

解决办法

 echo "set startup-with-shell off" > ~/.gdbinit

TUI(TextUser Interface)为GDB调试的文本用户界面,可以方便地显示源代码、汇编和寄存器文本窗口,为了方便和代码关联上可以调出tui窗口

tui enable

或者

sudo gdb -tui main

遇到问题

Loading Go Runtime support.
BFD: /usr/lib/dyld(i386:x86-64): unknown load command 0x3

解决办法

(gdb) source usr/local/Cellar/go/1.15.3/libexec/src/runtime/runtime-gdb.py
Loading Go Runtime support.

参考:https://golang.org/doc/gdb

TUI模式下有4个窗口:

(cmd)command 命令窗口. 可以键入调试命令

(src)source 源代码窗口. 显示当前行,断点等信息

(asm)assembly 汇编代码窗口

(reg)register 寄存器窗口


最常用的也就是默认使用的方式,也可以通过layout命令来进行选择自己需要的窗口,可参见help layout.

 gdbtui相关的其他命令


layout

用以修改窗口布局

 help layout

 layout src

 layout asm

 layout split


winheight

调整各个窗口的高度。

 help winheight

 winheight src +5

遇到问题:

(gdb) file main
Re symbols from main... BFD: usr/lib/dyld(i386:x86-64): unknown load command 0x34
Loading Go Runtime support.
BFD: usr/lib/dyld(i386:x86-64): unknown load command 0x34
BFD: usr/lib/dyld(i386:x86-64): unknown load command 0x34

解决办法,下载最新版10.2

http://ftp.gnu.org/gnu/gdb/

问题解决

b main.main
Thread 2 hit Breakpoint 1, main.main () at /Users/xiazemin/go/src/github.com/xiazemin/template_learn/asm/exp1/main.go:5
(gdb) winheight src -5
(gdb) layout split

界面如下


可以同步查看源码和对应的汇编代码