Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Debugging Code Generation in Go

Avatar for JBD JBD
February 02, 2020

Debugging Code Generation in Go

Avatar for JBD

JBD

February 02, 2020
Tweet

More Decks by JBD

Other Decks in Programming

Transcript

  1. @rakyll Who needs this talk? • Developers who want to

    debug the compilation. • Reverse engineers, security practitioners, ... • Current or prospective Go contributors. • Anyone who wants to study compilers.
  2. main program package main import "fmt" func main() { sum

    := 1 + 1 fmt.Printf("sum: %v\n", sum) }
  3. main program $ go build -x WORK=/var/folders/zq/wgh6df4s6fz2wjwdp5dvzlww005d 21/T/go-build399551378 mkdir -p

    $WORK/b001/ cat >$WORK/b001/importcfg.link << 'EOF' # internal packagefile github.com/rakyll/codegen=/Users/jbd/Library/Cach es/go-build/00/00ed60989b390a64bad3cb01d4ec61aae6 d0ea61e3e38fc35052d1ab5b0efe66-d packagefile ...
  4. main program $ go build -n # run dry WORK=/var/folders/zq/wgh6df4s6fz2wjwdp5dvzlww005d

    21/T/go-build399551378 mkdir -p $WORK/b001/ cat >$WORK/b001/importcfg.link << 'EOF' # internal packagefile github.com/rakyll/codegen=/Users/jbd/Library/Cach es/go-build/00/00ed60989b390a64bad3cb01d4ec61aae6 d0ea61e3e38fc35052d1ab5b0efe66-d packagefile ...
  5. main program $ go build -work # don’t delete work

    directory WORK=/var/folders/zq/wgh6df4s6fz2wjwdp5dvzlww005d 21/T/go-build444532126
  6. main program $ go list -f {{.GoFiles}} # investigate files

    [main.go] $ GOOS=windows go list -f {{.GoFiles}} [main.go main_windows.go] See https://golang.org/pkg/cmd/go/internal/list/ for more.
  7. main program $ go build -gcflags="-S" # print Go assembly

    # github.com/rakyll/codegen os.(*File).close STEXT dupok nosplit size=26 args=0x18 locals=0x0 0x0000 00000 (<autogenerated>:1) TEXT os.(*File).close(SB), DUPOK|NOSPLIT|ABIInternal, $0-24 0x0000 00000 (<autogenerated>:1) FUNCDATA$0, gclocals·e6397a44f8e1b6e77d0f200b4fba5269(SB) 0x0000 00000 (<autogenerated>:1) FUNCDATA...
  8. main program $ go tool objdump -s main.main <binary> TEXT

    main.main(SB) /Users/jbd/go/src/github.com/rakyll/codegen/main. go main.go:5 0x109adc0 65488b0c2530000000 MOVQ GS:0x30, CX main.go:5 0x109adc9 483b6110 CMPQ 0x10(CX), SP main.go:5 0x109adcd 0f8690000000 JBE 0x109ae63 main.go:5 0x109add3 4883ec68 SUBQ ...
  9. main program $ go tool nm <binary> | grep runtime.walltime

    1044b20 T runtime.walltime 1054c50 T runtime.walltime_trampoline
  10. main program $ go build -gcflags="-N" # disable optimizations $

    go build -gcflags="-l" # disable inlining $ go build -gcflags="-N -l" # disable both
  11. main program $ go build -gcflags="-m" # escape analysis $

    go build -gcflags="-m=2" # more info
  12. main program $ go build -gcflags="-live" # debug liveness $

    go build -gcflags="-live=2" # more info
  13. main program $ go build -gcflags="-bench=bench.out" $ go build -gcflags="-race"

    # race detector $ go build -gcflags="-memprofile=profile.out" $ go build -gcflags="-traceprofile=trace.out" # ...