Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在macOS上使用GDB调试Go程序_Go_Gdb - Fatal编程技术网

在macOS上使用GDB调试Go程序

在macOS上使用GDB调试Go程序,go,gdb,Go,Gdb,一个简单的围棋程序,比如说main.Go: package main func main() { println("hello, world!") } 然后用 go build -gcflags "-N -l" -o main main.go 使用GDB: $ gdb main GNU gdb (GDB) 8.2 (...) Reading symbols from main...(no debugging symbols found)...done. Loading Go Run

一个简单的围棋程序,比如说
main.Go

package main

func main() {
    println("hello, world!")
}
然后用

go build -gcflags "-N -l" -o main main.go
使用GDB:

$ gdb main
GNU gdb (GDB) 8.2
(...)
Reading symbols from main...(no debugging symbols found)...done.
Loading Go Runtime support.
(gdb) source /usr/local/Cellar/go/1.11/libexec/src/runtime/runtime-gdb.py
Loading Go Runtime support.
(gdb) info files
Symbols from "/Users/changkun/Desktop/demo/main".
Local exec file:
        `/Users/changkun/Desktop/demo/main', file type mach-o-x86-64.
        Entry point: 0x1049e20
        0x0000000001001000 - 0x000000000104dfcf is .text
        0x000000000104dfe0 - 0x0000000001077344 is __TEXT.__rodata
        (...)
(gdb) b *0x1049e20
Breakpoint 1 at 0x1049e20
(gdb)
GDB输出中没有
at
,Go版本为
Go版本go1.11 darwin/amd64
,并且:

$ ls -al /usr/local/bin | grep go
lrwxr-xr-x    1 changkun  admin        24 Aug 25 16:37 go -> ../Cellar/go/1.11/bin/go
======

linux环境中的相同过程:

docker run -itd --name golang golang:1.11
docker exec -it golang bash
然后进入容器安装
gdb

root@1326d3f1a957:/# gdb main
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
(...)
(gdb) info files
Symbols from "/main".
Local exec file:
        `/main', file type elf64-x86-64.
        Entry point: 0x44a2e0
        0x0000000000401000 - 0x000000000044ea8f is .text
        (...)
(gdb) b *0x44a2e0
Breakpoint 1 at 0x44a2e0: file /usr/local/go/src/runtime/rt0_linux_amd64.s, line 8.
(gdb)
Linux能够显示
(gdb)b*0x44a2e0
0x44a2e0处的断点1:file/usr/local/go/src/runtime/rt0\u linux\u amd64.s,第8行。


在macOS我错过了什么?如何在macOS上调试和跟踪程序?

在Go 1.11中,调试信息是为了减少二进制大小而压缩的,Mac上的gdb不理解压缩的DWARF

解决方法是还指定
-ldflags=-compressdwarf=false
,这与它所声称的完全一样

一般来说,要做到这一点:

export GOFLAGS="-ldflags=-compressdwarf=false"

请参阅讨论:

在Go 1.11中,为了减小二进制大小,对调试信息进行了压缩,而Mac上的gdb不理解压缩的DWARF

解决方法是还指定
-ldflags=-compressdwarf=false
,这与它所声称的完全一样

一般来说,要做到这一点:

export GOFLAGS="-ldflags=-compressdwarf=false"

参见讨论:

我误解了你的问题。您希望使用gdb和go二进制文件在较低级别进行调试。这可能有用@vorspung,因为文档在这里没有解决问题。你看,Linux上的调试工作得很好,它能够用断点显示所有内容。但是在macOS上,什么都没有出现。我误解了你的问题。您希望使用gdb和go二进制文件在较低级别进行调试。这可能有用@vorspung,因为文档在这里没有解决问题。你看,Linux上的调试工作得很好,它能够用断点显示所有内容。然而,在macOS上,什么都没有出现。