Golang标准库——runtime

runtime

runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见》reflect报的文档获取运行时类型系统的可编程接口。

Environment Variables

下面的环境变量($name或%name%,这依赖于主机的操作系统)控制go程序的运行时行为。它们的含义和用法可能在各发行版之间改变。

环境变量GOGC设置最初的垃圾收集目标百分比。当新申请的数据和前次垃圾收集剩下的存活数据的比率达到该百分比时,就会触发垃圾收集。默认GOGC=100。设置GOGC=off 会完全关闭垃圾收集。runtime/debug包的SetGCPercent函数允许在运行时修改该百分比。参见http://golang.org/pkg/runtime/debug/#SetGCPercent

环境变量GODEBUG控制运行时的debug输出。GODEBUG的值是逗号分隔的name=val对。支持的name如下:

allocfreetrace: 设置其为1,会导致每次分配都会被记录剖面,会记录每一个对象的分配、释放
  及其堆栈踪迹。
efence: 设置其为1,会导致分配器运行模式为:每个对象申请在独立的页和地址,且永不循环利用。
gctrace: 设置其为1,会导致垃圾收集器每次收集都向标准错误输出写入单行的数据,概述收集的总
  内存的大小和暂停的总时间长度。设置其为2,会写入同样的概述,但也会写入每次收集的两个数据。
gcdead: 设置其为1,会导致垃圾收集器摧毁任何它认为已经死掉的执行堆栈。
schedtrace: 设置其为X,会导致调度程序每隔X毫秒输出单行信息到标准错误输出,概述调度状态。
scheddetail: 设置schedtrace为X并设置其为1,会导致调度程序每隔X毫秒输出详细的多行信息,
  描述调度、进程、线程和go程的状态。

环境变量GOMAXPROCS限制可以同时运行用户层次的go代码的操作系统进程数。没有对代表go代码的、可以在系统调用中阻塞的go程数的限制;那些阻塞的go程不与GOMAXPROCS限制冲突。本包的GOMAXPROCS函数可以查询和修改该限制。

环境变量GOTRACEBACK控制当go程序因为不能恢复的panic或不期望的运行时情况失败时的输出。失败的程序默认会打印所有现存go程的堆栈踪迹(省略运行时系统中的函数),然后以状态码2退出。如果GOTRACEBACK为0,会完全忽略所有go程的堆栈踪迹。如果GOTRACEBACK为1,会采用默认行为。如果GOTRACEBACK为2,会打印所有现存go程包括运行时函数的堆栈踪迹。如果GOTRACEBACK为crash,会打印所有现存go程包括运行时函数的堆栈踪迹,并且如果可能会采用操作系统特定的方式崩溃,而不是退出。例如,在Unix系统里,程序会释放SIGABRT信号以触发核心信息转储。

环境变量GOARCH、GOOS、GOPATH和GOROOT构成完整的go环境变量集合。它们影响go程序的构建(参见http://golang.org/cmd/go andhttp://golang.org/pkg/go/build)。

GOARCH、GOOS和GOROOT在编译时被记录并可用本包的常量和函数获取,但它们不会影响运行时环境。

Constants

const Compiler = "gc"

Compiler是编译工具链的名字,工具链会构建可执行的二进制文件。已知的工具链是:

gc      The 5g/6g/8g compiler suite at code.google.com/p/go.
gccgo   The gccgo front end, part of the GCC compiler suite.
const GOARCH string = theGoarch

GOARCH是可执行程序的目标处理器架构(将要在该架构的机器上执行):386、amd64或arm。

const GOOS string = theGoos

GOOS是可执行程序的目标操作系统(将要在该操作系统的机器上执行):darwin、freebsd、linux等。

Variables

var MemProfileRate int = 512 * 1024

MemProfileRate控制会在内存profile里记录和报告的内存分配采样频率。内存profile记录器平均每分配MemProfileRate字节进行一次分配采样。

要在profile里包含每一个申请的块,可以将MemProfileRate设为1。要完全关闭profile的记录,设置本变量为0。

处理内存profile的工具假设profile记录速度在整个程序的生命期是固定的,并等于当前值。修改内存profile的程序应该只进行一次,且尽可能早的修改(例如,在main函数的开始处)。

type Error

type Error interface {
    error
    // RuntimeError是一个无操作的函数,仅用于区别运行时错误和普通错误。
    // 具有RuntimeError方法的错误类型就是运行时错误类型。
    RuntimeError()
}

Error接口用来识别运行时错误。

type TypeAssertionError

type TypeAssertionError struct {
    _interface    *_type
    concrete      *_type
    asserted      *_type
    missingMethod string // one method needed by Interface, missing from Concrete
}

TypeAssertionError表示一次失败的类型断言。

func (*TypeAssertionError) Error

func (e *TypeAssertionError) Error() string

func (*TypeAssertionError) RuntimeError

func (*TypeAssertionError) RuntimeError()

func GOROOT

func GOROOT() string

GOROOT返回Go的根目录。如果存在GOROOT环境变量,返回该变量的值;否则,返回创建Go时的根目录。

func Version

func Version() string

返回Go的版本字符串。它要么是递交的hash和创建时的日期;要么是发行标签如"go1.3"。

func NumCPU

func NumCPU() int

NumCPU返回本地机器的逻辑CPU个数。

func GOMAXPROCS

func GOMAXPROCS(n int) int

GOMAXPROCS设置可同时执行的最大CPU数,并返回先前的设置。 若 n < 1,它就不会更改当前设置。本地机器的逻辑CPU数可通过 NumCPU 查询。本函数在调度程序优化后会去掉。

func SetCPUProfileRate

func SetCPUProfileRate(hz int)

SetCPUProfileRate设置CPU profile记录的速率为平均每秒hz次。如果hz<=0,SetCPUProfileRate会关闭profile的记录。如果记录器在执行,该速率必须在关闭之后才能修改。

绝大多数使用者应使用runtime/pprof包或testing包的-test.cpuprofile选项而非直接使用SetCPUProfileRate。

func CPUProfile

func CPUProfile() []byte

CPUProfile返回二进制CPU profile堆栈跟踪数据的下一个chunk,函数会阻塞直到该数据可用。 如果profile的记录被关闭,且在记录器开着的时候积累的profile数据都被返回了,CPUProfile会返回nil。调用者在再次调用本函数之前应先保存返回的数据。

绝大多数使用者应使用 runtime/pprof包或testing包的-test.cpuprofile选项而非直接使用 CPUProfile。

func GC

func GC()

GC执行一次垃圾回收。

func SetFinalizer

func SetFinalizer(x, f interface{})

SetFinalizer将x的终止器设置为f。当垃圾收集器发现一个不能接触的(即引用计数为零,程序中不能再直接或间接访问该对象)具有终止器的块时,它会清理该关联(对象到终止器)并在独立go程调用f(x)。这使x再次可以接触,但没有了绑定的终止器。如果SetFinalizer没有被再次调用,下一次垃圾收集器将视x为不可接触的,并释放x。

SetFinalizer(x, nil)会清理任何绑定到x的终止器。

参数x必须是一个指向通过new申请的对象的指针,或者通过对复合字面值取址得到的指针。参数f必须是一个函数,它接受单个可以直接用x类型值赋值的参数,也可以有任意个被忽略的返回值。如果这两条任一条不被满足,本函数就会中断程序。

终止器会按依赖顺序执行:如果A指向B,两者都有终止器,且它们无法从其它方面接触,只有A的终止器执行;A被释放后,B的终止器就可以执行。如果一个循环结构包含一个具有终止器的块,该循环不能保证会被当垃圾收集,终止器也不能保证会执行;因为没有尊重依赖关系的顺序。

x的终止器会在x变为不可接触之后的任意时间被调度执行。不保证终止器会在程序退出前执行,因此一般终止器只用于在长期运行的程序中释放关联到某对象的非内存资源。例如,当一个程序丢弃一个os.File对象时没有调用其Close方法,该os.File对象可以使用终止器去关闭对应的操作系统文件描述符。但依靠终止器去刷新内存中的I/O缓冲如bufio.Writer是错误的,因为缓冲不会在程序退出时被刷新。

如果*x的大小为0字节,不保证终止器会执行。

一个程序会有单独一个go程顺序执行所有的终止器。如果一个终止器必须运行较长时间,它应该在内部另开go程执行该任务。

type MemStats

type MemStats struct {
    // 一般统计
    Alloc      uint64 // 已申请且仍在使用的字节数
    TotalAlloc uint64 // 已申请的总字节数(已释放的部分也算在内)
    Sys        uint64 // 从系统中获取的字节数(下面XxxSys之和)
    Lookups    uint64 // 指针查找的次数
    Mallocs    uint64 // 申请内存的次数
    Frees      uint64 // 释放内存的次数
    // 主分配堆统计
    HeapAlloc    uint64 // 已申请且仍在使用的字节数
    HeapSys      uint64 // 从系统中获取的字节数
    HeapIdle     uint64 // 闲置span中的字节数
    HeapInuse    uint64 // 非闲置span中的字节数
    HeapReleased uint64 // 释放到系统的字节数
    HeapObjects  uint64 // 已分配对象的总个数
    // L低层次、大小固定的结构体分配器统计,Inuse为正在使用的字节数,Sys为从系统获取的字节数
    StackInuse  uint64 // 引导程序的堆栈
    StackSys    uint64
    MSpanInuse  uint64 // mspan结构体
    MSpanSys    uint64
    MCacheInuse uint64 // mcache结构体
    MCacheSys   uint64
    BuckHashSys uint64 // profile桶散列表
    GCSys       uint64 // GC元数据
    OtherSys    uint64 // 其他系统申请
    // 垃圾收集器统计
    NextGC       uint64 // 会在HeapAlloc字段到达该值(字节数)时运行下次GC
    LastGC       uint64 // 上次运行的绝对时间(纳秒)
    PauseTotalNs uint64
    PauseNs      [256]uint64 // 近期GC暂停时间的循环缓冲,最近一次在[(NumGC+255)%256]
    NumGC        uint32
    EnableGC     bool
    DebugGC      bool
    // 每次申请的字节数的统计,61是C代码中的尺寸分级数
    BySize [61]struct {
        Size    uint32
        Mallocs uint64
        Frees   uint64
    }
}

MemStats记录内存申请和分配的统计信息。

func ReadMemStats

func ReadMemStats(m *MemStats)

ReadMemStats将内存申请和分配的统计信息填写进m。

type MemProfileRecord

type MemProfileRecord struct {
    AllocBytes, FreeBytes     int64       // 申请和释放的字节数
    AllocObjects, FreeObjects int64       // 申请和释放的对象数
    Stack0                    [32]uintptr // 该记录的调用栈踪迹,以第一个零值成员截止
}

MemProfileRecord用于描述某个调用栈序列申请和释放的活动对象等信息。

func (*MemProfileRecord) InUseBytes

func (r *MemProfileRecord) InUseBytes() int64

InUseBytes返回正在使用的字节数(AllocBytes – FreeBytes)

func (*MemProfileRecord) InUseObjects

func (r *MemProfileRecord) InUseObjects() int64

InUseObjects返回正在使用的对象数(AllocObjects - FreeObjects)

func (*MemProfileRecord) Stack

func (r *MemProfileRecord) Stack() []uintptr

Stack返回关联至此记录的调用栈踪迹,即r.Stack0的前缀。

func MemProfile

func MemProfile(p []MemProfileRecord, inuseZero bool) (n int, ok bool)

MemProfile返回当前内存profile中的记录数n。若len(p)>=n,MemProfile会将此分析报告复制到p中并返回(n, true);如果len(p)<n,MemProfile则不会更改p,而只返回(n, false)。

如果inuseZero为真,该profile就会包含无效分配记录(其中r.AllocBytes>0,而r.AllocBytes==r.FreeBytes。这些内存都是被申请后又释放回运行时环境的)。

大多数调用者应当使用runtime/pprof包或testing包的-test.memprofile标记,而非直接调用MemProfile。

func Breakpoint

func Breakpoint()

Breakpoint执行一个断点陷阱。

func Stack

func Stack(buf []byte, all bool) int

Stack将调用其的go程的调用栈踪迹格式化后写入到buf中并返回写入的字节数。若all为true,函数会在写入当前go程的踪迹信息后,将其它所有go程的调用栈踪迹都格式化写入到buf中。

func Caller

func Caller(skip int) (pc uintptr, file string, line int, ok bool)

Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。(由于历史原因,skip的意思在Caller和Callers中并不相同。)函数的返回值为调用栈标识符、文件名、该调用在文件中的行号。如果无法获得信息,ok会被设为false。

func Callers

func Callers(skip int, pc []uintptr) int

函数把当前go程调用栈上的调用栈标识符填入切片pc中,返回写入到pc中的项数。实参skip为开始在pc中记录之前所要跳过的栈帧数,0表示Callers自身的调用栈,1表示Callers所在的调用栈。返回写入p的项数。

type StackRecord

type StackRecord struct {
    Stack0 [32]uintptr // 该记录的调用栈踪迹,以第一个零值成员截止
}

StackRecord描述单条调用栈。

func (*StackRecord) Stack

func (r *StackRecord) Stack() []uintptr

Stack返回与记录相关联的调用栈踪迹,即r.Stack0的前缀。

type Func

type Func struct {
    // 内含隐藏或非导出字段
}

func FuncForPC

func FuncForPC(pc uintptr) *Func

FuncForPC返回一个表示调用栈标识符pc对应的调用栈的*Func;如果该调用栈标识符没有对应的调用栈,函数会返回nil。每一个调用栈必然是对某个函数的调用。

func (*Func) Name

func (f *Func) Name() string

Name返回该调用栈所调用的函数的名字。

func (*Func) FileLine

func (f *Func) FileLine(pc uintptr) (file string, line int)

FileLine返回该调用栈所调用的函数的源代码文件名和行号。如果pc不是f内的调用栈标识符,结果是不精确的。

func (*Func) Entry

func (f *Func) Entry() uintptr

Entry返回该调用栈的调用栈标识符。

func NumCgoCall

func NumCgoCall() int64

NumCgoCall返回当前进程执行的cgo调用次数。

func NumGoroutine

func NumGoroutine() int

NumGoroutine返回当前存在的Go程数。

func Goexit

func Goexit()

Goexit终止调用它的go程。其它go程不会受影响。Goexit会在终止该go程前执行所有defer的函数。

在程序的main go程调用本函数,会终结该go程,而不会让main返回。因为main函数没有返回,程序会继续执行其它的go程。如果所有其它go程都退出了,程序就会崩溃。

func Gosched

func Gosched()

Gosched使当前go程放弃处理器,以让其它go程运行。它不会挂起当前go程,因此当前go程未来会恢复执行。

func GoroutineProfile

func GoroutineProfile(p []StackRecord) (n int, ok bool)

GoroutineProfile返回活跃go程的堆栈profile中的记录个数。若len(p) >= n,函数就会将profile中的记录复制到p中并返回(n, true)。若len(p) < n,则不会修改p,而只返回(n, false)。

绝大多数调用者应当使用runtime/pprof包,而非直接调用GoroutineProfile。

func LockOSThread

func LockOSThread()

将调用的go程绑定到它当前所在的操作系统线程。除非调用的go程退出或调用UnlockOSThread,否则它将总是在该线程中执行,而其它go程则不能进入该线程。

func UnlockOSThread

func UnlockOSThread()

将调用的go程解除和它绑定的操作系统线程。若调用的go程未调用LockOSThread,UnlockOSThread不做操作。

func ThreadCreateProfile

func ThreadCreateProfile(p []StackRecord) (n int, ok bool)

返回线程创建profile中的记录个数。如果len(p)>=n,本函数就会将profile中的记录复制到p中并返回(n, true)。若len(p)<n,则不会更改p,而只返回(n, false)。

绝大多数使用者应当使用runtime/pprof包,而非直接调用ThreadCreateProfile。

type BlockProfileRecord

type BlockProfileRecord struct {
    Count  int64
    Cycles int64
    StackRecord
}

BlockProfileRecord用于描述某个调用栈序列发生的阻塞事件的信息。

func SetBlockProfileRate

func SetBlockProfileRate(rate int)

SetBlockProfileRate控制阻塞profile记录go程阻塞事件的采样频率。对于一个阻塞事件,平均每阻塞rate纳秒,阻塞profile记录器就采集一份样本。

要在profile中包

括每一个阻塞事件,需传入rate=1;要完全关闭阻塞profile的记录,需传入rate<=0。

func BlockProfile

func BlockProfile(p []BlockProfileRecord) (n int, ok bool)

BlockProfile返回当前阻塞profile中的记录个数。如果len(p)>=n,本函数就会将此profile中的记录复制到p中并返回(n, true)。如果len(p)<n,本函数则不会修改p,而只返回(n, false)。

绝大多数使用者应当使用runtime/pprof包或testing包的-test.blockprofile标记, 而非直接调用 BlockProfile。

  • cgo
  • debug
  • pprof
  • race
  • trace

cgo

cgo 包含有 cgo 工具生成的代码的运行时支持。 使用cgo来查看关于cgo命令的详情。

debug

debug包包含用于程序在运行时进行自我调试的功能。

func FreeOSMemory

func FreeOSMemory()

FreeOSMemory强制进行一次垃圾收集,以释放尽量多的内存回操作系统。(即使没有调用,运行时环境也会在后台任务里逐渐将内存释放给系统)

func SetGCPercent

func SetGCPercent(percent int) int

SetGCPercent设定垃圾收集的目标百分比:当新申请的内存大小占前次垃圾收集剩余可用内存大小的比率达到设定值时,就会触发垃圾收集。SetGCPercent返回之前的设定。初始值设定为环境变量GOGC的值;如果没有设置该环境变量,初始值为100。percent参数如果是负数值,会关闭垃圾收集。

func SetMaxStack

func SetMaxStack(bytes int) int

SetMaxStack设置该以被单个go程调用栈可使用的内存最大值。如果任何go程在增加其调用栈时超出了该限制,程序就会崩溃。SetMaxStack返回之前的设置。默认设置在32位系统是250MB,在64位系统是1GB。

SetMaxStack主要用于限制无限递归的go程带来的灾难。 它只会限制未来增长的调用栈。

func SetMaxThreads

func SetMaxThreads(threads int) int

SetMaxThreads设置go程序可以使用的最大操作系统线程数。如果程序试图使用超过该限制的线程数,就会导致程序崩溃。SetMaxThreads返回之前的设置,初始设置为10000个线程。

该限制控制操作系统线程数,而非go程数。go程序只有在一个go程准备要执行,但现有的线程都阻塞在系统调用、cgo调用或被runtime.LockOSThread函数阻塞在其他go程时,才会创建一个新的线程。

SetMaxThreads主要用于限制程序无限制的创造线程导致的灾难。目的是让程序在干掉操作系统之前,先干掉它自己。

func SetPanicOnFault

func SetPanicOnFault(enabled bool) bool

SetPanicOnFault控制程序在不期望(非nil)的地址出错时的运行时行为。这些错误一般是因为运行时内存破坏的bug引起的,因此默认反应是使程序崩溃。使用内存映射的文件或进行内存的不安全操作的程序可能会在非nil的地址出现错误;SetPanicOnFault允许这些程序请求运行时只触发一个panic,而不是崩溃。SetPanicOnFault只用于当前的go程。它返回之前的设置。

type GCStats

type GCStats struct {
    LastGC         time.Time       // 最近一次垃圾收集的时间
    NumGC          int64           // 垃圾收集的次数
    PauseTotal     time.Duration   // 所有暂停收集垃圾消耗的总时间
    Pause          []time.Duration // 每次暂停收集垃圾的消耗的时间
    PauseQuantiles []time.Duration
}

GCStats收集了近期垃圾收集的信息。

func ReadGCStats

func ReadGCStats(stats *GCStats)

ReadGCStats将垃圾收集信息填入stats里。stats.Pause字段的长度是依赖于系统的;stats.Pause切片如果长度足够会被重用,否则会重新申请。ReadGCStats可能会使用stats.Pause切片的全部容量。

如果stats.PauseQuantiles字段是非空的,ReadGCStats会在其中填写说明暂停时间分配的分位数。例如,如果len(stats.PauseQuantiles)为5,该字段会被填写上0%、25%、50%、75%、100%位置的分位数(就是说,不大于该位置暂停时间的暂停次数占总暂停次数的比例分别是0%、25%……)

func WriteHeapDump

func WriteHeapDump(fd uintptr)

WriteHeapDump将内存分配堆和其中对象的描述写入给定文件描述符fd指定的文件。

堆转储格式参见http://golang.org/s/go13heapdump

func Stack

func Stack() []byte

Stack 返回格式化的go程的调用栈踪迹。 对于每一个调用栈,它包括原文件的行信息和PC值;对go函数还会尝试获取调用该函数的函数或方法,及调用所在行的文本。

此函数已废弃。请使用runtime包中的Stack函数代替。

func PrintStack

func PrintStack()

PrintStack将Stack返回信息打印到标准错误输出。

pprof

pprof包以pprof可视化工具期望的格式书写运行时剖面数据。

pprof的更多信息参见http://code.google.com/p/google-perftools/

func Profiles

func Profiles() []*Profile

Profiles返回所有已知profile的切片,按名称排序。

func StartCPUProfile

func StartCPUProfile(w io.Writer) error

StartCPUProfile为当前进程开启CPU profile。在分析时,分析报告会缓存并写入到w中。若分析已经开启,StartCPUProfile就会返回错误。

func StopCPUProfile

func StopCPUProfile()

StopCPUProfile会停止当前的CPU profile(如果有)。StopCPUProfile 只会在所有的分析报告写入完毕后才会返回。

func WriteHeapProfile

func WriteHeapProfile(w io.Writer) error

WriteHeapProfile是Lookup("heap").WriteTo(w, 0) 的简写。它是为了保持向后兼容性而存在的。

type Profile

type Profile struct {
    name  string
    mu    sync.Mutex
    m     map[interface{}][]uintptr
    count func() int
    write func(io.Writer, int) error
}

Profile是一个调用栈踪迹的集合,显示导致特定事件(如内存分配)的实例的调用栈序列。包可以创建并维护它们自己的profile;它一般用于跟踪必须被显式关闭的资源,例如文件或网络连接。

一个Profile的方法可被多个Go程同时调用。

每个Profile都有唯一的名称。有些Profile是预定义的:

goroutine      - 当前Go所有程的调用栈踪迹
heap           - 所有堆分配的采样
threadcreate   - 导致新的OS线程创建的调用栈踪迹
block          - 导致同步原语水平的阻塞的调用栈踪迹

这些预声明的Profile自我维护,如果对它们调用Add或者Remove时,将导致panic。

CPU profile不能作为Profile使用。它有专门的API,即StartCPUProfile和StopCPUProfile函数,因为它在分析时是以流的形式输出到writer中的。

func Lookup

func Lookup(name string) *Profile

Lookup返回具有指定名字的Profile;如果没有,会返回nil。

func NewProfile

func NewProfile(name string) *Profile

以给定的名称创建一个新的Profile。若拥有该名称的Profile已存在,NewProfile就会panic。

约定会使用'import/path.'前缀来为每个包创建单独的命名空间。

func (*Profile) Name

func (p *Profile) Name() string

Name返回该Profile的名称,它可被传入Lookup来重新获取该Profile。

func (*Profile) Add

func (p *Profile) Add(value interface{}, skip int)

Add 将当前的执行栈添加到该分析中,并与value关联。Add在一个内部映射中存储值,因此value必须适于用作映射键,且在对应的Remove调用之前不会被垃圾收集。

若分析的映射中已经存在value键,Add就会引发panic。

skip 参数与runtime.Caller的skip参数意义相同,它用于控制调用栈踪迹从哪里开始。skip=0时候会从调用Add的函数开始。例如,给出如下执行栈:

Add
called from rpc.NewClient
called from mypkg.Run
called from main.main

当skip=0时,调用栈踪迹从rpc.NewClient对Add的调用开始;当skp=1时,堆调用踪迹从对rpc.NewClient的调用开始。

func (*Profile) Count

func (p *Profile) Count() int

Count返回该Profile中当前执行栈的数量。

func (*Profile) Remove

func (p *Profile) Remove(value interface{})

Remove从该分析中移除与值value相关联的执行栈。若值value不在此分析中,则不做操作。

func (*Profile) WriteTo

func (p *Profile) WriteTo(w io.Writer, debug int) error

函数将pprof格式的profile快照写入w中。若一个向w的写入返回一个错误,WriteTo就会返回该错误;否则会返回nil。

debug 参数用于开启附加的输出。如果debug=0,只会打印pprof所需要的十六进制地址;如果debug=1,会将地址翻译为函数名和行号并添加注释,以便让程序员无需工具阅读分析报告。

预定义Profile为其它debug值赋予了含义。例如,当打印“Go程”的分析报告时,debug=2意为:由于不可恢复的恐慌而濒临崩溃时,使用与Go程序相同的格式打印Go程的堆栈信息。

Bugs

NetBSD和OS X上的profile记录服务是不完整、不准确的,参见http://golang.org/issue/6047获取细节。

race

race包实现了数据竞争检测逻辑。没有提供公共接口。

关于race detector的详情参见 http://golang.org/doc/articles/race_detector.html

trace

GO执行跟踪器。 跟踪器捕获各种执行事件,例如goroutine创建/阻止/取消阻止,syscall输入/退出/阻止,GC相关事件,堆大小的更改,处理器启动/停止等,并将它们写入io.Writer中。 紧凑的形式。 对于大多数事件,都会捕获精确的纳秒级时间戳和堆栈跟踪。 稍后可以使用“执行工具跟踪”命令分析跟踪。

func Start

func Start(w io.Writer) error

Start可以跟踪当前程序。 跟踪时,跟踪将被缓冲并写入w。 如果已经启用了跟踪,则Start将返回错误。

func Stop

func Stop()

Stop停止当前跟踪(如果有)。 仅在跟踪的所有写操作完成后才返回Stop。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349