runc/libcontainer/stacktrace/frame.go

39 lines
732 B
Go
Raw Normal View History

package stacktrace
import (
"path/filepath"
"runtime"
"strings"
)
// NewFrame returns a new stack frame for the provided information
func NewFrame(pc uintptr, file string, line int) Frame {
fn := runtime.FuncForPC(pc)
Fix stacktrace panic According to https://golang.org/src/runtime/symtab.go?s=3423:3455#L94 It is possibile that runtime.FuncForPC() returns nil, don't know how but I do met this problem when some kernel config problems cause `p.createNetworkInterfaces` return error. panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0] goroutine 74 [running]: github_com_docker_libcontainer_stacktrace.NewFrame /go/src/github.com/docker/docker/vendor/src/github.com/docker/libcontainer/stacktrace/frame.go:12 github_com_docker_libcontainer_stacktrace.Capture /go/src/github.com/docker/docker/vendor/src/github.com/docker/libcontainer/stacktrace/capture.go:18 libcontainer.newSystemError /go/src/github.com/docker/docker/vendor/src/github.com/docker/libcontainer/generic_error.go:48 github_com_docker_libcontainer.start.pN42_github_com_docker_libcontainer.initProcess /go/src/github.com/docker/docker/vendor/src/github.com/docker/libcontainer/process_linux.go:177 github_com_docker_libcontainer.Start.pN45_github_com_docker_libcontainer.linuxContainer /go/src/github.com/docker/docker/vendor/src/github.com/docker/libcontainer/container_linux.go:102 github_com_docker_docker_daemon_execdriver_native.Run.pN56_github_com_docker_docker_daemon_execdriver_native.driver /go/src/github.com/docker/docker/.gopath/src/github.com/docker/docker/daemon/execdriver/native/driver.go:149 github_com_docker_docker_daemon.Run.pN38_github_com_docker_docker_daemon.Daemon /go/src/github.com/docker/docker/.gopath/src/github.com/docker/docker/daemon/daemon.go:1007 github_com_docker_docker_daemon.Start.pN48_github_com_docker_docker_daemon.containerMonitor /go/src/github.com/docker/docker/.gopath/src/github.com/docker/docker/daemon/monitor.go:138 promise.$nested0 /go/src/github.com/docker/docker/.gopath/src/github.com/docker/docker/pkg/promise/promise.go:8 created by github_com_docker_docker_pkg_promise.Go /go/src/github.com/docker/docker/.gopath/src/github.com/docker/docker/pkg/promise/promise.go:7 Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
2015-05-15 13:09:46 +08:00
if fn == nil {
return Frame{}
}
pack, name := parseFunctionName(fn.Name())
return Frame{
Line: line,
File: filepath.Base(file),
Package: pack,
Function: name,
}
}
func parseFunctionName(name string) (string, string) {
i := strings.LastIndex(name, ".")
if i == -1 {
return "", name
}
return name[:i], name[i+1:]
}
// Frame contains all the information for a stack frame within a go program
type Frame struct {
File string
Function string
Package string
Line int
}