github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/internal/debug/flags.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:40</date>
    10  //</624342640711700480>
    11  
    12  
    13  package debug
    14  
    15  import (
    16  	"fmt"
    17  	"io"
    18  	"net/http"
    19  	_ "net/http/pprof"
    20  	"os"
    21  	"runtime"
    22  
    23  	"github.com/ethereum/go-ethereum/log"
    24  	"github.com/ethereum/go-ethereum/log/term"
    25  	"github.com/ethereum/go-ethereum/metrics"
    26  	"github.com/ethereum/go-ethereum/metrics/exp"
    27  	"github.com/fjl/memsize/memsizeui"
    28  	colorable "github.com/mattn/go-colorable"
    29  	"gopkg.in/urfave/cli.v1"
    30  )
    31  
    32  var Memsize memsizeui.Handler
    33  
    34  var (
    35  	verbosityFlag = cli.IntFlag{
    36  		Name:  "verbosity",
    37  		Usage: "Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail",
    38  		Value: 3,
    39  	}
    40  	vmoduleFlag = cli.StringFlag{
    41  		Name:  "vmodule",
    42    /*GE:“每个模块的详细程度:逗号分隔的<pattern>=<level>(例如eth/*=5,p2p=4)”,
    43    值:“
    44   }
    45   backtraceAtFlag=cli.stringFlag_
    46    名称:“回溯”,
    47    用法:“在特定的日志记录语句(例如\”block.go:271\“)请求堆栈跟踪”,
    48    值:“
    49   }
    50   debugflag=cli.boolflag_
    51    名称:“调试”,
    52    用法:“用调用站点位置(文件和行号)预先准备日志消息”,
    53   }
    54   pprofflag=cli.boolflag_
    55    姓名:“PPROF”,
    56    用法:“启用pprof http服务器”,
    57   }
    58   pprofPortFlag=cli.intFlag_
    59    姓名:“PrPopPt”,
    60    用法:“pprof http服务器侦听端口”,
    61    值:6060,
    62   }
    63   pprofaddflag=cli.stringflag_
    64    名称:“pprofaddr”,
    65    用法:“pprof http服务器侦听接口”,
    66    值:“127.0.0.1”,
    67   }
    68   memprofilerateflag=cli.intflag_
    69    名称:“MemProfileRate”,
    70    用法:“以给定速率打开内存分析”,
    71    值:runtime.memprofilerate,
    72   }
    73   blockProfileRateFlag=cli.intFlag_
    74    名称:“blockprofilerate”,
    75    用法:“以给定速率打开块分析”,
    76   }
    77   CpPrPuliFrase= CLI.STRIGLAG {
    78    名称:“cpuprofile”,
    79    用法:“将CPU配置文件写入给定文件”,
    80   }
    81   traceFlag=cli.stringFlag_
    82    姓名:“追踪”,
    83    用法:“将执行跟踪写入给定文件”,
    84   }
    85  )
    86  
    87  //标志保存调试所需的所有命令行标志。
    88  var flags=[]cli.flag_
    89   详细标志,vmoduleflag,backtraceatflag,debugflag,
    90   pprofFlag、pprofAddFlag、pprofPortFlag
    91   memprofilerateflag、blockprofilerateflag、cpupprofileflag、traceflag、
    92  }
    93  
    94  var
    95   Ostream日志处理程序
    96   glogger*日志.gloghandler
    97  )
    98  
    99  函数()
   100   usecolor:=term.istty(os.stderr.fd())和os.getenv(“term”)!=“哑巴”
   101   输出:=io.writer(os.stderr)
   102   如果使用颜色{
   103    输出=可着色。新的可着色stderr()
   104   }
   105   ostream=log.streamHandler(输出,log.terminalFormat(useColor))
   106   glogger=log.newgloghandler(奥斯特里姆)
   107  }
   108  
   109  //St设置基于CLI标志初始化配置文件和日志记录。
   110  //应该在程序中尽早调用它。
   111  func设置(ctx*cli.context,logdir string)错误
   112   /测井
   113   log printorigins(ctx.globalbool(debugflag.name))。
   114   如果Logdir!=“{”
   115    rfh,err:=log.rotatingfilehandler(
   116     洛迪尔
   117     262144,
   118     log.JSONFormatOrderedEx(false, true),
   119    )
   120    如果犯错!= nIL{
   121     返回错误
   122    }
   123    glogger.sethandler(log.multihandler(ostream,rfh))。
   124   }
   125   glogger.verbosity(log.lvl(ctx.globalint(verbosityflag.name)))
   126   glogger.vmodule(ctx.globalString(vmoduleFlag.name))。
   127   glogger.backtraceat(ctx.globalstring(backtraceatflag.name))。
   128   log.root().sethandler(glogger)
   129  
   130   //分析,跟踪
   131   runtime.memprofilerate=ctx.globalint(memprofilerateflag.name)
   132   handler.setBlockProfileRate(ctx.globalint(blockProfileRateFlag.name))。
   133   如果tracefile:=ctx.globalstring(traceflag.name);tracefile!=“{”
   134    如果错误:=handler.startgotrace(tracefile);错误!= nIL{
   135     返回错误
   136    }
   137   }
   138   如果cpufile:=ctx.globalString(cpuProfileFlag.name);cpufile!=“{”
   139    if err := Handler.StartCPUProfile(cpuFile); err != nIL{
   140     返回错误
   141    }
   142   }
   143  
   144   //PPROF服务器
   145   如果ctx.globalbool(pprofflag.name)
   146    地址:=fmt.sprintf(“%s:%d”,ctx.globalString(pprofaddflag.name),ctx.globalint(pprofportflag.name))
   147    startpprof(地址)
   148   }
   149   返回零
   150  }
   151  
   152  func StartPProf(地址字符串){
   153   //在任何/debug/metrics请求中将go metrics挂接到expvar中,加载所有var
   154   //从注册表到ExpVar,并执行常规ExpVaR处理程序。
   155   exp.exp(metrics.defaultregistry)
   156   HTTP.句柄(“/MeistSe/”,http.StripPrefix(“/MESIZE”和MESIZE))
   157   log.info(“启动pprof服务器”,“addr”,fmt.sprintf(“http://%s/debug/pprof”,address))。
   158   转到函数()
   159    如果错误:=http.listenandserve(address,nil);错误!= nIL{
   160     log.error(“运行pprof server失败”,“err”,err)
   161    }
   162   }()
   163  }
   164  
   165  //exit停止所有正在运行的配置文件,将其输出刷新到
   166  //各自的文件。
   167  FUNC退出(){
   168   handler.stopcupprofile()处理程序
   169   handler.stopgotrace()。
   170  }
   171