🌚

Mac Golang GDB 错误汇总

Tags
Go
Published
March 31, 2021
Author
问题:
 
本地 MacOS 上通过 GDB 调试 golang 程序,结果提示 No symbol table is loaded. Use the "file" command
 
解决:
go build -gcflags "-N -l" -ldflags=-compressdwarf=false main.go
 
问题:
(gdb) run Starting program: /usr/local/bin/fabnacci Unable to find Mach task port for process-id 23330: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))
解决:
  1. 创建证书:
  1. 打开 Keychain Access 应用程序(/Applications/Utilities/Keychain Access.app)
  1. 执行菜单 钥匙串访问 -> 证书助理 -> 创建证书
  1. 创建一个位置位于系统的代码签名自签名根证书,并添加信任。
  1. Mojave (10.14) 之前的系统,直接执行:codesign -fs gdb-cert $(which gdb)
  1. 如果是 Mojave (10.14) 之后的系统,先创建一个文件 gdb-entitlement.xml,内容为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.debugger</key> <true/> </dict> </plist>
  1. codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
 

参考阅读

Debugging Go Program
定位 Go 程序的错误,通常有两种方式: Go是编译型语言,且 IDE对调试的支持不太好,绝大多数 Go的初学者调试 Go程序都是通过 log.Printf 等打印日志方式定位问题。通常过程如下: 如果程序比较复杂,需要反复增加日志输出才能找到问题原因。熟练的使用调试器能够提高我们面对这样问题的灵活性。本文重点总结介绍调试相关知识,具体调试操作网上相关资料已经很全面(见最后一章参考),不作为重点。 GDB不能很好的理解 Go程序。 Go程序和 GDB的 stack management、 threading、 runtime模型差异很大,并可能导致调试器输出不正确的结果。因此,虽然 GDB在某些场景下有用,比如调试 Cgo代码、调试 runtime,但是对于 Go程序来说,尤其是高并发程序, GDB不是一个可靠的调试器。而且,对于 Go 语言项目本身来说,解决这些的问题很困难,也不是一个高优先级的事情。 可以通过-w 标记告诉连接器去掉这些调试信息,比如: gc编译器生成的程序包含 函数内联和变量注册。这些优化可能会让 gdb 调试更加困难。如果你需要禁用这些优化,使用下面的参数构建程序: 如果你想要使用 gdb检查一个 core dump,你可以在程序崩溃的时候触发一个dump。在支持dump的 OS上,使用 GOTRACEBACK=crash环境变量(参考 runtime package documentation )。 Go 1.11版本中,由于编译器会产生更多更准确的调试信息,为了减少二进制的大小, DWARF调试信息编译时候会默认被压缩。这对于大多数 ELF工具来说这是透明的,也得到 Delve支持。但是macOS和Windows上一些工具不支持。如果要禁用 DWARF压缩,可以在编译的时候传入参数-ldflags "-compressdwarf=false" 。 Go
Debugging Go Program