代码之家  ›  专栏  ›  技术社区  ›  user674669

阿尔卑斯码头集装箱内的dlv seg断层

  •  0
  • user674669  · 技术社区  · 6 年前

    我在alpine:3.7.1容器内运行dlv。它因以下错误而崩溃:

    / # /dlv --listen=:40000 --headless=true --api-version=2 exec /server
    Could not create config directory: user: Current not implemented on linux/amd64.panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x50 pc=0x8c7dca]
    
    goroutine 1 [running]:
    github.com/derekparker/delve/cmd/dlv/cmds.execute(0x0, 0xc420057a00, 0x1, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0)
            /go/src/github.com/derekparker/delve/cmd/dlv/cmds/commands.go:575 +0x3aa
    github.com/derekparker/delve/cmd/dlv/cmds.New.func4(0xc42014a000, 0xc420057a00, 0x1, 0x4)
            /go/src/github.com/derekparker/delve/cmd/dlv/cmds/commands.go:182 +0x65
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).execute(0xc42014a000, 0xc42001c6c0, 0x4, 0x6, 0xc42014a000, 0xc42001c6c0)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:647 +0x237
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xc4200d1680, 0xc4200d1d40, 0xc4200d1b00, 0xc4200d18c0)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:733 +0x2d4
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).Execute(0xc4200d1680, 0xc4200d1680, 0x9fad07)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:692 +0x2b
    main.main()
            /go/src/github.com/derekparker/delve/cmd/dlv/main.go:24 +0xe4
    

    # Compile stage
    FROM golang:1.10.1-alpine3.7 AS build-env
    ENV CGO_ENABLED 0
    ADD . /go/src/hello
    
    # The -gcflags "all=-N -l" flag helps us get a better debug experience
    #RUN go build -x -gcflags "all=-N -l" -o /server hello
    RUN go build -gcflags "all=-N -l" -o /server hello
    
    # Compile Delve
    RUN apk add --no-cache git
    RUN go get github.com/derekparker/delve/cmd/dlv
    
    # Final stage
    FROM alpine:3.7
    
    # Port 8080 belongs to our application, 40000 belongs to Delve
    EXPOSE 8080 40000
    
    # Allow delve to run on Alpine based containers.
    RUN apk add --no-cache libc6-compat
    
    WORKDIR /
    
    COPY --from=build-env /server /
    COPY --from=build-env /go/bin/dlv /
    
    # Run delve
    #CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "exec", "/server"]
    #/dlv --listen=:40000 --headless=true --api-version=2 exec /server
    
    CMD ["/bin/sh"]
    

    我以以下方式运行容器:

    $ docker run -p 8080:8080 -p 40000:40000 --name hello-go-delve3 --cap-add SYS_PTRACE --security-opt apparmor=unconfined
    

    如果我在没有delve的情况下运行服务器,服务器将正常启动并提供服务请求。

    # /server
    2018/11/09 01:13:18 starting server...
    

    # /dlv version
    Could not create config directory: user: Current not implemented on  linux/amd64.Delve Debugger
    Version: 1.1.0
    Build: $Id: 1990ba12450cab9425a2ae62e6ab988725023d5c $
    
    # uname -a
    Linux 168365401d8d 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018 x86_64 Linux
    
    # cat /etc/alpine-release 
    3.7.1
    

    如果我在后台运行/server,然后从/dlv连接到它,则会从/dlv获得类似的segfault:

    # /server &
    2018/11/09 01:25:02 starting server...
    
    # ps
    PID   USER     TIME   COMMAND
        1 root       0:00 /bin/sh
       21 root       0:00 /server
       24 root       0:00 ps
    
    # /dlv --listen=:40000 --headless=true --api-version=2 attach 21
    Could not create config directory: user: Current not implemented on linux/amd64.panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x50 pc=0x8c7dca]
    
    goroutine 1 [running]:
    github.com/derekparker/delve/cmd/dlv/cmds.execute(0x15, 0xc420057a50, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0)
            /go/src/github.com/derekparker/delve/cmd/dlv/cmds/commands.go:575 +0x3aa
    github.com/derekparker/delve/cmd/dlv/cmds.attachCmd(0xc4200d18c0, 0xc420057a40, 0x1, 0x4)
            /go/src/github.com/derekparker/delve/cmd/dlv/cmds/commands.go:469 +0xc2
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).execute(0xc4200d18c0, 0xc42001c660, 0x4, 0x6, 0xc4200d18c0, 0xc42001c660)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:647 +0x237
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xc4200d1680, 0xc4200d1d40, 0xc4200d1b00, 0xc4200d18c0)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:733 +0x2d4
    github.com/derekparker/delve/vendor/github.com/spf13/cobra.(*Command).Execute(0xc4200d1680, 0xc4200d1680, 0x9fad07)
            /go/src/github.com/derekparker/delve/vendor/github.com/spf13/cobra/command.go:692 +0x2b
    main.main()
            /go/src/github.com/derekparker/delve/cmd/dlv/main.go:24 +0xe4
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   user674669    6 年前

    如果我改变

    FROM golang:1.10.1-alpine3.7 AS build-env
    

    FROM golang:1.10-alpine3.7 AS build-env
    

    我认为这个更改确保了构建容器与运行时容器相同。