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
    

    可見,調試如需列出源代碼還需在其編譯時寫進的文件名和行號中查找。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM