V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
51300520
V2EX  ›  问与答

golang 的编译没有 debug release 之分吗?

  •  
  •   51300520 · 2019-05-07 01:06:54 +08:00 · 7590 次点击
    这是一个创建于 2056 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了这么久的 go,突然想到这个问题,它为啥不像 c++这种有 debug 和 release? 它那个默认编译是直接 release 版本?

    12 条回复    2019-05-09 10:43:10 +08:00
    coderluan
        1
    coderluan  
       2019-05-07 01:23:41 +08:00
    debug 和 release 其实只是编译器预设的常用编译选项组合,和语言本身没关系的。
    c++用 gcc 也是没 debug 和 release 的,但是有-d,-o2 之类的选项,你可以自己组合出 debug 和 release 一样的效果。
    所以 go 也是一回事,具体看你用什么编译器,即使编译器没有 debug 和 release,你也是可以自己改编译选项的。
    yanaraika
        2
    yanaraika  
       2019-05-07 02:04:30 +08:00 via Android
    默认是 RelWithDebugInfo
    Cu635
        3
    Cu635  
       2019-05-07 02:52:00 +08:00
    @coderluan
    ……
    对于 c/c++来说,debug 出来的二进制文件是内嵌源代码的,编译选项就是 gcc -g,直接用 hexdump -C 就能看到。当然还有其它调试用的信息,包括内嵌源代码这些调试信息这个才是根本差别,也是要用编译器的编译选项开关来控制的
    vindurriel
        4
    vindurriel  
       2019-05-07 04:36:20 +08:00 via iPhone
    有的 去掉 debug 信息能瘦身 15% 参见 go build 说明文档
    mason961125
        5
    mason961125  
       2019-05-07 07:45:39 +08:00
    strip 了解一下?
    gamexg
        6
    gamexg  
       2019-05-07 08:49:34 +08:00 via Android
    默认带符号链接,对外发布可以去掉。
    另外默认未开启内存竟态检查,调试版本可以开启。
    flynaj
        7
    flynaj  
       2019-05-07 09:04:56 +08:00 via Android
    默认参数是 debug 版,加编译参数-ldflags "-w -s"才是 release. -w 为去掉调试信息,-s 为去掉符号表,文件大小会减小。
    coderluan
        8
    coderluan  
       2019-05-07 12:38:43 +08:00
    @Cu635

    根本差别应该是两个,一个是你说的调试信息,另一个是代码优化,-o1 -o2 这些,这些开关直接影响程序生成的性能的,也就是 release 比 debug 快的原因,非常重要。
    sujin190
        9
    sujin190  
       2019-05-07 14:52:32 +08:00
    @coderluan #8 go 的文档没有特别强调,那估计是生成的代码是一样的,没有特别优化,而且编译号运行和 go run 直接运行似乎看不出性能差距,感觉应该是一样的
    coderluan
        10
    coderluan  
       2019-05-07 15:09:21 +08:00
    @sujin190 go 确实没有,8 楼是回复 3 楼“对于 c/c++来说”的内容。
    Cu635
        11
    Cu635  
       2019-05-08 16:04:22 +08:00
    @coderluan
    代码优化不是根本差别,那是锦上添花。很重要没错。调试信息才是根本。
    coderluan
        12
    coderluan  
       2019-05-09 10:43:10 +08:00
    @Cu635 这个我完全不认同,C/C++主要应用领域就是性能相关的领域,release (-ox )的性能比 debug 的性能提升非常非常明显,所有的官方发布的版本一定会带-ox,所以他叫 release,而不是 nodebug.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2877 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:21 · PVG 22:21 · LAX 06:21 · JFK 09:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.