前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang源码分析:mac安装gdb

golang源码分析:mac安装gdb

作者头像
golangLeetcode
发布2022-08-02 19:23:58
8170
发布2022-08-02 19:23:58
举报
文章被收录于专栏:golang算法架构leetcode技术php

首先安装工具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/%E5%9C%A8-macOS-Mojave-%E4%B8%8A%E6%AD%A3%E5%B8%B8%E4%BD%BF%E7%94%A8-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

界面如下

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档