github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/internal/debug/flags.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2016 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package debug
    26  
    27  import (
    28  	"fmt"
    29  	"io"
    30  	"net/http"
    31  	_ "net/http/pprof"
    32  	"os"
    33  	"runtime"
    34  
    35  	"github.com/ethereum/go-ethereum/log"
    36  	"github.com/ethereum/go-ethereum/log/term"
    37  	"github.com/ethereum/go-ethereum/metrics"
    38  	"github.com/ethereum/go-ethereum/metrics/exp"
    39  	"github.com/fjl/memsize/memsizeui"
    40  	colorable "github.com/mattn/go-colorable"
    41  	"gopkg.in/urfave/cli.v1"
    42  )
    43  
    44  var Memsize memsizeui.Handler
    45  
    46  var (
    47  	verbosityFlag = cli.IntFlag{
    48  		Name:  "verbosity",
    49  		Usage: "Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail",
    50  		Value: 3,
    51  	}
    52  	vmoduleFlag = cli.StringFlag{
    53  		Name:  "vmodule",
    54    /*GE:“每个模块的详细程度:逗号分隔的<pattern>=<level>(例如eth/*=5,p2p=4)”,
    55    值:“
    56   }
    57   backtraceAtFlag=cli.stringFlag_
    58    名称:“回溯”,
    59    用法:“在特定的日志记录语句(例如\”block.go:271\“)请求堆栈跟踪”,
    60    值:“
    61   }
    62   debugflag=cli.boolflag_
    63    名称:“调试”,
    64    用法:“用调用站点位置(文件和行号)预先准备日志消息”,
    65   }
    66   pprofflag=cli.boolflag_
    67    姓名:“PPROF”,
    68    用法:“启用pprof http服务器”,
    69   }
    70   pprofPortFlag=cli.intFlag_
    71    姓名:“PrPopPt”,
    72    用法:“pprof http服务器侦听端口”,
    73    值:6060,
    74   }
    75   pprofaddflag=cli.stringflag_
    76    名称:“pprofaddr”,
    77    用法:“pprof http服务器侦听接口”,
    78    值:“127.0.0.1”,
    79   }
    80   memprofilerateflag=cli.intflag_
    81    名称:“MemProfileRate”,
    82    用法:“以给定速率打开内存分析”,
    83    值:runtime.memprofilerate,
    84   }
    85   blockProfileRateFlag=cli.intFlag_
    86    名称:“blockprofilerate”,
    87    用法:“以给定速率打开块分析”,
    88   }
    89   CpPrPuliFrase= CLI.STRIGLAG {
    90    名称:“cpuprofile”,
    91    用法:“将CPU配置文件写入给定文件”,
    92   }
    93   traceFlag=cli.stringFlag_
    94    姓名:“追踪”,
    95    用法:“将执行跟踪写入给定文件”,
    96   }
    97  )
    98  
    99  //标志保存调试所需的所有命令行标志。
   100  var flags=[]cli.flag_
   101   详细标志,vmoduleflag,backtraceatflag,debugflag,
   102   pprofFlag、pprofAddFlag、pprofPortFlag
   103   memprofilerateflag、blockprofilerateflag、cpupprofileflag、traceflag、
   104  }
   105  
   106  var
   107   Ostream日志处理程序
   108   glogger*日志.gloghandler
   109  )
   110  
   111  函数()
   112   usecolor:=term.istty(os.stderr.fd())和os.getenv(“term”)!=“哑巴”
   113   输出:=io.writer(os.stderr)
   114   如果使用颜色{
   115    输出=可着色。新的可着色stderr()
   116   }
   117   ostream=log.streamHandler(输出,log.terminalFormat(useColor))
   118   glogger=log.newgloghandler(奥斯特里姆)
   119  }
   120  
   121  //St设置基于CLI标志初始化配置文件和日志记录。
   122  //应该在程序中尽早调用它。
   123  func设置(ctx*cli.context,logdir string)错误
   124   /测井
   125   log printorigins(ctx.globalbool(debugflag.name))。
   126   如果Logdir!=“{”
   127    rfh,err:=log.rotatingfilehandler(
   128     洛迪尔
   129     262144,
   130     log.JSONFormatOrderedEx(false, true),
   131    )
   132    如果犯错!= nIL{
   133     返回错误
   134    }
   135    glogger.sethandler(log.multihandler(ostream,rfh))。
   136   }
   137   glogger.verbosity(log.lvl(ctx.globalint(verbosityflag.name)))
   138   glogger.vmodule(ctx.globalString(vmoduleFlag.name))。
   139   glogger.backtraceat(ctx.globalstring(backtraceatflag.name))。
   140   log.root().sethandler(glogger)
   141  
   142   //分析,跟踪
   143   runtime.memprofilerate=ctx.globalint(memprofilerateflag.name)
   144   handler.setBlockProfileRate(ctx.globalint(blockProfileRateFlag.name))。
   145   如果tracefile:=ctx.globalstring(traceflag.name);tracefile!=“{”
   146    如果错误:=handler.startgotrace(tracefile);错误!= nIL{
   147     返回错误
   148    }
   149   }
   150   如果cpufile:=ctx.globalString(cpuProfileFlag.name);cpufile!=“{”
   151    if err := Handler.StartCPUProfile(cpuFile); err != nIL{
   152     返回错误
   153    }
   154   }
   155  
   156   //PPROF服务器
   157   如果ctx.globalbool(pprofflag.name)
   158    地址:=fmt.sprintf(“%s:%d”,ctx.globalString(pprofaddflag.name),ctx.globalint(pprofportflag.name))
   159    startpprof(地址)
   160   }
   161   返回零
   162  }
   163  
   164  func StartPProf(地址字符串){
   165   //在任何/debug/metrics请求中将go metrics挂接到expvar中,加载所有var
   166   //从注册表到ExpVar,并执行常规ExpVaR处理程序。
   167   exp.exp(metrics.defaultregistry)
   168   HTTP.句柄(“/MeistSe/”,http.StripPrefix(“/MESIZE”和MESIZE))
   169   log.info(“启动pprof服务器”,“addr”,fmt.sprintf(“http://%s/debug/pprof”,address))。
   170   转到函数()
   171    如果错误:=http.listenandserve(address,nil);错误!= nIL{
   172     log.error(“运行pprof server失败”,“err”,err)
   173    }
   174   }()
   175  }
   176  
   177  //exit停止所有正在运行的配置文件,将其输出刷新到
   178  //各自的文件。
   179  FUNC退出(){
   180   handler.stopcupprofile()处理程序
   181   handler.stopgotrace()。
   182  }