Update:现在文档中有一个关于Debugging Go Code with GDB的官方页面.自 compose 此答案以来,许多情况都发生了变化,下面列出的几个限制也已删除.我将把这个答案的睡觉留给后人,但是如果你想调试Go代码,请点击上面的链接.
Go链接器now emit个可由gdb版本7解释的调试符号.十、
从上面链接的博客文章中突出显示:
你可以...
- 在GDB 7.x版中加载GO程序
- 逐行列出所有GO、C和汇编源文件(GO运行时的部分是用C和汇编语言编写的),
- 按行设置断点并逐步遍历代码,
- 打印堆栈跟踪和判断堆栈帧,以及
- 找到地址并打印大多数变量的内容.
还有一些不便之处:
- MacOSX附带的GDB版本6.x无法读取发出的DWARF代码.我们很乐意接受补丁以使DWARF输出与标准的OS X GDB兼容,但在此问题得到解决之前,您需要下载、构建并安装GDB 7.x才能在OS X下使用它.源代码可以在http://sourceware.org/gdb/download/找到.由于OSX的特殊性,您需要使用chgrp、procmod和chmod g+s在本地文件系统上安装二进制文件.
- 名称是用包名限定的,由于GDB不理解Go包,所以您必须以其全名引用每个项目.例如,包main中名为v的变量必须称为"main".v',单引号.这样做的结果是,变量和函数名的制表符完成不起作用.
- 词法范围信息有些模糊.如果有多个同名变量,则第n个实例将有一个形式为"#n"的后缀.我们计划解决这个问题,但需要对编译器和链接器之间交换的数据进行一些更改.
- 片和字符串变量在运行时库中表示为其底层 struct .它们将类似于{data=0x2aaaaab3e320,len=1,cap=1}.对于切片,必须取消引用数据指针才能判断元素.
有些东西不起作用:
- 无法判断通道、函数、接口和映射变量.
- 只有GO变量使用类型信息进行注释;运行库的C变量没有.
- Windows和ARM二进制文件不包含DWARM调试信息,因此不能使用GDB进行判断.