go build -ldflags 参数及 gdb 调试
gvgarven · · 28382 次点击 · · 开始浏览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
运行观察打印,看见文件名、行号等信息依然保留。
./hello打印输出如下。而且将该可执行文件置于任何目录下执行,都显示相同的输出。
可见,文件名和行号为编译时将当前的文件名和行号编译进二进制文件中。/home/gv/hello.go:17: {tom 10}使用LiteIDE查看二进制文件可以搜索到
MyCat标识符。使用gdb无法调试,可见调试信息已清除
gdb ./hello (gdb) l main.main No symbol table is loaded. Use the "file" command.
不使用-ldflags
go build ./hello.go
运行打印看见文件名、行号。
使用LiteIDE查看二进制文件可以搜索到
MyCat标识符。上述都与使用 -ldflags 参数得到的结果相同。
使用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 }将源文件删除后再使用gdb调试,可打断点单步调试,但无法列出源代码,只能列出行号和文件名。
gdb ./hello (gdb) l main.main 5 /home/gv/hello.go: No such file or directory. in /home/gv/hello.go可见,调试如需列出源代码还需在其编译时写进的文件名和行号中查找。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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
运行观察打印,看见文件名、行号等信息依然保留。
./hello打印输出如下。而且将该可执行文件置于任何目录下执行,都显示相同的输出。
可见,文件名和行号为编译时将当前的文件名和行号编译进二进制文件中。/home/gv/hello.go:17: {tom 10}使用LiteIDE查看二进制文件可以搜索到
MyCat标识符。使用gdb无法调试,可见调试信息已清除
gdb ./hello (gdb) l main.main No symbol table is loaded. Use the "file" command.
不使用-ldflags
go build ./hello.go
运行打印看见文件名、行号。
使用LiteIDE查看二进制文件可以搜索到
MyCat标识符。上述都与使用 -ldflags 参数得到的结果相同。
使用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 }将源文件删除后再使用gdb调试,可打断点单步调试,但无法列出源代码,只能列出行号和文件名。
gdb ./hello (gdb) l main.main 5 /home/gv/hello.go: No such file or directory. in /home/gv/hello.go可见,调试如需列出源代码还需在其编译时写进的文件名和行号中查找。