go build -ldflags 参数及 gdb 调试

go build -ldflags 参数及 gdb 调试

有时发布时我们想隐藏所有代码实现相关的信息,使用 go build -ldflags 参数可以实现相关要求。

示例代码

本文使用版本为go 1.6。

package main

import "log"

type MyCat struct {
    name string
    age  int
}

func main() {
    cat := MyCat{
        name: "tom",
        age:  10,
    }

    log.SetFlags(log.Llongfile)
    log.Println(cat)
}

使用-ldflags

设置编译参数-ldflags "-w -s"
其中-w为去掉调试信息(无法使用gdb调试),-s为去掉符号表(暂未清楚具体作用)。

go build -ldflags "-w -s" ./hello.go
  1. 运行观察打印,看见文件名、行号等信息依然保留。

    ./hello

    打印输出如下。而且将该可执行文件置于任何目录下执行,都显示相同的输出。
    可见,文件名和行号为编译时将当前的文件名和行号编译进二进制文件中。

    /home/gv/hello.go:17: {tom 10}
  2. 使用LiteIDE查看二进制文件可以搜索到MyCat标识符。

  3. 使用gdb无法调试,可见调试信息已清除

    gdb ./hello
    (gdb) l main.main
    No symbol table is loaded.  Use the "file" command.

不使用-ldflags

go build ./hello.go
  1. 运行打印看见文件名、行号。

  2. 使用LiteIDE查看二进制文件可以搜索到MyCat标识符。

    上述都与使用 -ldflags 参数得到的结果相同。

  3. 使用gdb调试可列出源代码,也可打断点单步调试。

    (gdb) l main.main
    5   type MyCat struct {
    6       name string
    7       age  int
    8   }
    9
    10  func main() {
    11      cat := MyCat{
    12          name: "tom",
    13          age:  10,
    14      }
  4. 将源文件删除后再使用gdb调试,可打断点单步调试,但无法列出源代码,只能列出行号和文件名。

    gdb ./hello
    (gdb) l main.main
    5   /home/gv/hello.go: No such file or directory.
        in /home/gv/hello.go

    可见,调试如需列出源代码还需在其编译时写进的文件名和行号中查找。

转载于:https://www.cnblogs.com/gvgarven/p/go_build-ldflags.html

你可能感兴趣的:(go build -ldflags 参数及 gdb 调试)