首先安装工具gdb,可以
代码语言:javascript复制brew install gdb
也可以源码安装
http://ftp.gnu.org/gnu/gdb/
代码语言:javascript复制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编译错误,网上这个说法
代码语言:javascript复制gdb 8.1 is incompatible with macOS 10.13. Downgrade to gdb 8.0.1 instead
https://sourceware.org/gdb/wiki/PermissionsDarwin
代码语言:javascript复制http://ftp.gnu.org/gnu/gdb/gdb-8.0.1.tar.gz
对mac 10.15.是不ok的,9.2可以编译通过
一段简单的源码开始
代码语言:javascript复制package main
import "fmt"
func main() {
a := 1
b := 2
fmt.Println(a b)
}
编译,保留调试信息,去除内联优化
代码语言:javascript复制go build -o main -gcflags="-N -l" main.go
然后开始调试
代码语言:javascript复制gdb main
如果报错
代码语言:javascript复制Unable to find Mach task port for process-id 47072: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
是权限不够
代码语言:javascript复制sudo gdb main
或者给gdb创建证书,具体步骤参考
https://blog.roy4801.tw/2020/01/27/在-macOS-Mojave-上正常使用-gdb/
在钥匙串中生成证书
代码语言:javascript复制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)
如果遇到
代码语言:javascript复制[New Thread 0xe03 of process 51333]
[New Thread 0x1203 of process 51333]
During startup program terminated with signal SIGTRAP, Trace/breakpoint trap.
解决办法
代码语言:javascript复制 echo "set startup-with-shell off" > ~/.gdbinit
TUI(TextUser Interface)为GDB调试的文本用户界面,可以方便地显示源代码、汇编和寄存器文本窗口,为了方便和代码关联上可以调出tui窗口
代码语言:javascript复制tui enable
或者
代码语言:javascript复制sudo gdb -tui main
遇到问题
代码语言:javascript复制Loading Go Runtime support.
BFD: /usr/lib/dyld(i386:x86-64): unknown load command 0x3
解决办法
代码语言:javascript复制(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
遇到问题:
代码语言:javascript复制(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
代码语言:javascript复制http://ftp.gnu.org/gnu/gdb/
问题解决
代码语言:javascript复制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
界面如下
可以同步查看源码和对应的汇编代码