gdb

首先安装工具gdb,可以



brew install gdb
也可以源码安装



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



tar -zxvf gdb-9.2.tar.gz

cd gdb-9.2/
./configure
mkdir build
cd build
../configure
make
make install
一段简单的源码开始



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

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/



https://segmentfault.com/q/1010000004136334



TUI模式下有4个窗口,



(cmd)command 命令窗口. 可以键入调试命令
(src)source 源代码窗口. 显示当前行,断点等信息
(asm)assembly 汇编代码窗口
(reg)register 寄存器窗口



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



#3. gdbtui相关的其他命令



layout



用以修改窗口布局



help layout
layout src
layout asm
layout split
winheight



调整各个窗口的高度。



help winheight
winheight src +5
winheight src -4
space



当前窗口放大或者缩小以后,gdbtui窗口不会发生变化,我们可以通过space 键强行刷新gdbtui窗口。



focus next / prev



在默认设置下,方向键和PageUp PageDn 都是用来控制gdbtui的src窗口的,所以,我们常用的上下键用来显示前一条命令和后一条命令的功能就没有了, 不过这个时候我们可以通过ctrl + n / ctrl +p 来获取这个功能。



ps:当我们通过方向键调整了gdbtui 的src 窗口以后,可以通过update命令重新把焦点定位到当前执行的代码上。



我们可以通过focus命令来调整焦点位置,默认情况下是在src窗口,通过focus next命令, 焦点就移到cmd窗口了,这时候就可以像以前一样,通过方向键来切换到上一条命令和下一条命令。



help focus
focus cmd
focus src
焦点不在src窗口以后,我们就不同通过方向键来浏览源码了



https://www.cxyzjd.com/article/analogous_love/53333894
https://stackoverflow.com/questions/47002178/no-symbol-table-using-gdb-on-compiled-programs



gdb: “No symbol table is loaded”
https://stackoverflow.com/questions/9245685/gdb-no-symbol-table-is-loaded



GDB: [ No source available ]
https://stackoverflow.com/questions/56726190/gdb-no-source-available



https://stackoverflow.com/questions/2324602/no-source-available-for-main-error-when-debugging-simple-c-in-eclipse-with



https://www.cnblogs.com/loveyan1314/articles/10333015.html



https://golang.org/doc/gdb
https://www.cloudbees.com/blog/using-gdb-debugger-with-go



https://github.com/NixOS/nixpkgs/issues/51293
https://studygolang.com/articles/23201?fr=sidebar



(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



在执行go build的时候添加-ldflags=-compressdwarf=false参数。或,添加以下环境变量export GOFLAGS=”-ldflags=-compressdwarf=false”



https://www.cnblogs.com/zhuxiaoxi/p/10095097.html



https://segmentfault.com/a/1190000021883681



https://zhuanlan.zhihu.com/p/68398728



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/



安装10.2问题解决
http://ftp.gnu.org/gnu/gdb/


Category golang