package debug
Import Path
runtime/debug (on go.dev)
Dependency Relation
imports 9 packages, and imported by 2 packages
Involved Source Files
garbage.go
mod.go
Package debug contains facilities for programs to debug themselves while
they are running.
stubs.go
debug.s
Code Examples
package main
import (
"io"
"log"
"os"
"os/exec"
"runtime/debug"
)
// ExampleSetCrashOutput_monitor shows an example of using
// [debug.SetCrashOutput] to direct crashes to a "monitor" process,
// for automated crash reporting. The monitor is the same executable,
// invoked in a special mode indicated by an environment variable.
func main() {
appmain()
// This Example doesn't actually run as a test because its
// purpose is to crash, so it has no "Output:" comment
// within the function body.
//
// To observe the monitor in action, replace the entire text
// of this comment with "Output:" and run this command:
//
// $ go test -run=ExampleSetCrashOutput_monitor runtime/debug
// panic: oops
// ...stack...
// monitor: saved crash report at /tmp/10804884239807998216.crash
}
// appmain represents the 'main' function of your application.
func appmain() {
monitor()
// Run the application.
println("hello")
panic("oops")
}
// monitor starts the monitor process, which performs automated
// crash reporting. Call this function immediately within main.
//
// This function re-executes the same executable as a child process,
// in a special mode. In that mode, the call to monitor will never
// return.
func monitor() {
const monitorVar = "RUNTIME_DEBUG_MONITOR"
if os.Getenv(monitorVar) != "" {
// This is the monitor (child) process.
log.SetFlags(0)
log.SetPrefix("monitor: ")
crash, err := io.ReadAll(os.Stdin)
if err != nil {
log.Fatalf("failed to read from input pipe: %v", err)
}
if len(crash) == 0 {
// Parent process terminated without reporting a crash.
os.Exit(0)
}
// Save the crash report securely in the file system.
f, err := os.CreateTemp("", "*.crash")
if err != nil {
log.Fatal(err)
}
if _, err := f.Write(crash); err != nil {
log.Fatal(err)
}
if err := f.Close(); err != nil {
log.Fatal(err)
}
log.Fatalf("saved crash report at %s", f.Name())
}
// This is the application process.
// Fork+exec the same executable in monitor mode.
exe, err := os.Executable()
if err != nil {
log.Fatal(err)
}
cmd := exec.Command(exe, "-test.run=ExampleSetCrashOutput_monitor")
cmd.Env = append(os.Environ(), monitorVar+"=1")
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stderr
pipe, err := cmd.StdinPipe()
if err != nil {
log.Fatalf("StdinPipe: %v", err)
}
debug.SetCrashOutput(pipe.(*os.File), debug.CrashOptions{}) // (this conversion is safe)
if err := cmd.Start(); err != nil {
log.Fatalf("can't start monitor: %v", err)
}
// Now return and start the application proper...
}
Package-Level Type Names (total 5)
BuildInfo represents the build information read from a Go binary.
Deps describes all the dependency modules, both direct and indirect,
that contributed packages to the build of this binary.
GoVersion is the version of the Go toolchain that built the binary
(for example, "go1.19.2").
Main describes the module that contains the main package for the binary.
Path is the package path of the main package for the binary
(for example, "golang.org/x/tools/cmd/stringer").
Settings describes the build settings used to build the binary.
(*BuildInfo) String() string
*BuildInfo : expvar.Var
*BuildInfo : fmt.Stringer
func ParseBuildInfo(data string) (bi *BuildInfo, err error)
func ReadBuildInfo() (info *BuildInfo, ok bool)
func debug/buildinfo.Read(r io.ReaderAt) (*buildinfo.BuildInfo, error)
func debug/buildinfo.ReadFile(name string) (info *buildinfo.BuildInfo, err error)
A BuildSetting is a key-value pair describing one setting that influenced a build.
Defined keys include:
- -buildmode: the buildmode flag used (typically "exe")
- -compiler: the compiler toolchain flag used (typically "gc")
- CGO_ENABLED: the effective CGO_ENABLED environment variable
- CGO_CFLAGS: the effective CGO_CFLAGS environment variable
- CGO_CPPFLAGS: the effective CGO_CPPFLAGS environment variable
- CGO_CXXFLAGS: the effective CGO_CXXFLAGS environment variable
- CGO_LDFLAGS: the effective CGO_LDFLAGS environment variable
- GOARCH: the architecture target
- GOAMD64/GOARM/GO386/etc: the architecture feature level for GOARCH
- GOOS: the operating system target
- vcs: the version control system for the source tree where the build ran
- vcs.revision: the revision identifier for the current commit or checkout
- vcs.time: the modification time associated with vcs.revision, in RFC3339 format
- vcs.modified: true or false indicating whether the source tree had local modifications
Key and Value describe the build setting.
Key must not contain an equals sign, space, tab, or newline.
Value must not contain newlines ('\n').
Key and Value describe the build setting.
Key must not contain an equals sign, space, tab, or newline.
Value must not contain newlines ('\n').
CrashOptions provides options that control the formatting of the
fatal crash message.
func SetCrashOutput(f *os.File, opts CrashOptions) error
GCStats collect information about recent garbage collections.
// time of last collection
// number of garbage collections
// pause history, most recent first
// pause end times history, most recent first
PauseQuantiles []time.Duration
// total pause for all collections
func ReadGCStats(stats *GCStats)
A Module describes a single module included in a build.
// module path
// replaced by this module
// checksum
// module version
Package-Level Functions (total 14)
FreeOSMemory forces a garbage collection followed by an
attempt to return as much memory to the operating system
as possible. (Even if this is not called, the runtime gradually
returns memory to the operating system in a background task.)
func ParseBuildInfo(data string) (bi *BuildInfo, err error)
PrintStack prints to standard error the stack trace returned by runtime.Stack.
ReadBuildInfo returns the build information embedded
in the running binary. The information is available only
in binaries built with module support.
ReadGCStats reads statistics about garbage collection into stats.
The number of entries in the pause history is system-dependent;
stats.Pause slice will be reused if large enough, reallocated otherwise.
ReadGCStats may use the full capacity of the stats.Pause slice.
If stats.PauseQuantiles is non-empty, ReadGCStats fills it with quantiles
summarizing the distribution of pause time. For example, if
len(stats.PauseQuantiles) is 5, it will be filled with the minimum,
25%, 50%, 75%, and maximum pause times.
SetCrashOutput configures a single additional file where unhandled
panics and other fatal errors are printed, in addition to standard error.
There is only one additional file: calling SetCrashOutput again overrides
any earlier call.
SetCrashOutput duplicates f's file descriptor, so the caller may safely
close f as soon as SetCrashOutput returns.
To disable this additional crash output, call SetCrashOutput(nil).
If called concurrently with a crash, some in-progress output may be written
to the old file even after an overriding SetCrashOutput returns.
SetGCPercent sets the garbage collection target percentage:
a collection is triggered when the ratio of freshly allocated data
to live data remaining after the previous collection reaches this percentage.
SetGCPercent returns the previous setting.
The initial setting is the value of the GOGC environment variable
at startup, or 100 if the variable is not set.
This setting may be effectively reduced in order to maintain a memory
limit.
A negative percentage effectively disables garbage collection, unless
the memory limit is reached.
See SetMemoryLimit for more details.
SetMaxStack sets the maximum amount of memory that
can be used by a single goroutine stack.
If any goroutine exceeds this limit while growing its stack,
the program crashes.
SetMaxStack returns the previous setting.
The initial setting is 1 GB on 64-bit systems, 250 MB on 32-bit systems.
There may be a system-imposed maximum stack limit regardless
of the value provided to SetMaxStack.
SetMaxStack is useful mainly for limiting the damage done by
goroutines that enter an infinite recursion. It only limits future
stack growth.
SetMaxThreads sets the maximum number of operating system
threads that the Go program can use. If it attempts to use more than
this many, the program crashes.
SetMaxThreads returns the previous setting.
The initial setting is 10,000 threads.
The limit controls the number of operating system threads, not the number
of goroutines. A Go program creates a new thread only when a goroutine
is ready to run but all the existing threads are blocked in system calls, cgo calls,
or are locked to other goroutines due to use of runtime.LockOSThread.
SetMaxThreads is useful mainly for limiting the damage done by
programs that create an unbounded number of threads. The idea is
to take down the program before it takes down the operating system.
SetMemoryLimit provides the runtime with a soft memory limit.
The runtime undertakes several processes to try to respect this
memory limit, including adjustments to the frequency of garbage
collections and returning memory to the underlying system more
aggressively. This limit will be respected even if GOGC=off (or,
if SetGCPercent(-1) is executed).
The input limit is provided as bytes, and includes all memory
mapped, managed, and not released by the Go runtime. Notably, it
does not account for space used by the Go binary and memory
external to Go, such as memory managed by the underlying system
on behalf of the process, or memory managed by non-Go code inside
the same process. Examples of excluded memory sources include: OS
kernel memory held on behalf of the process, memory allocated by
C code, and memory mapped by syscall.Mmap (because it is not
managed by the Go runtime).
More specifically, the following expression accurately reflects
the value the runtime attempts to maintain as the limit:
runtime.MemStats.Sys - runtime.MemStats.HeapReleased
or in terms of the runtime/metrics package:
/memory/classes/total:bytes - /memory/classes/heap/released:bytes
A zero limit or a limit that's lower than the amount of memory
used by the Go runtime may cause the garbage collector to run
nearly continuously. However, the application may still make
progress.
The memory limit is always respected by the Go runtime, so to
effectively disable this behavior, set the limit very high.
[math.MaxInt64] is the canonical value for disabling the limit,
but values much greater than the available memory on the underlying
system work just as well.
See https://go.dev/doc/gc-guide for a detailed guide explaining
the soft memory limit in more detail, as well as a variety of common
use-cases and scenarios.
The initial setting is math.MaxInt64 unless the GOMEMLIMIT
environment variable is set, in which case it provides the initial
setting. GOMEMLIMIT is a numeric value in bytes with an optional
unit suffix. The supported suffixes include B, KiB, MiB, GiB, and
TiB. These suffixes represent quantities of bytes as defined by
the IEC 80000-13 standard. That is, they are based on powers of
two: KiB means 2^10 bytes, MiB means 2^20 bytes, and so on.
SetMemoryLimit returns the previously set memory limit.
A negative input does not adjust the limit, and allows for
retrieval of the currently set memory limit.
SetPanicOnFault controls the runtime's behavior when a program faults
at an unexpected (non-nil) address. Such faults are typically caused by
bugs such as runtime memory corruption, so the default response is to crash
the program. Programs working with memory-mapped files or unsafe
manipulation of memory may cause faults at non-nil addresses in less
dramatic situations; SetPanicOnFault allows such programs to request
that the runtime trigger only a panic, not a crash.
The runtime.Error that the runtime panics with may have an additional method:
Addr() uintptr
If that method exists, it returns the memory address which triggered the fault.
The results of Addr are best-effort and the veracity of the result
may depend on the platform.
SetPanicOnFault applies only to the current goroutine.
It returns the previous setting.
SetTraceback sets the amount of detail printed by the runtime in
the traceback it prints before exiting due to an unrecovered panic
or an internal runtime error.
The level argument takes the same values as the GOTRACEBACK
environment variable. For example, SetTraceback("all") ensure
that the program prints all goroutines when it crashes.
See the package runtime documentation for details.
If SetTraceback is called with a level lower than that of the
environment variable, the call is ignored.
Stack returns a formatted stack trace of the goroutine that calls it.
It calls [runtime.Stack] with a large enough buffer to capture the entire trace.
WriteHeapDump writes a description of the heap and the objects in
it to the given file descriptor.
WriteHeapDump suspends the execution of all goroutines until the heap
dump is completely written. Thus, the file descriptor must not be
connected to a pipe or socket whose other end is in the same Go
process; instead, use a temporary file or network socket.
The heap dump format is defined at https://golang.org/s/go15heapdump.
The pages are generated with Golds v0.7.0-preview. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |