golang源码分析:mac安装gdb

2022-08-02 19:23:58 浏览数 (1)

首先安装工具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

界面如下

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

0 人点赞