aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-01-26 21:39:21 +0800
committerFelix Lange <fjl@twurst.com>2016-01-28 20:36:11 +0800
commit3750d835a1697f6784c727074cc959dda33cdcf3 (patch)
tree6183747f1ce69b6bb1ed256e4dd9a1bba0031d69 /cmd
parente287b56b69cdf8340f679e9cfd229c959cc45e24 (diff)
downloadgo-tangerine-3750d835a1697f6784c727074cc959dda33cdcf3.tar.gz
go-tangerine-3750d835a1697f6784c727074cc959dda33cdcf3.tar.zst
go-tangerine-3750d835a1697f6784c727074cc959dda33cdcf3.zip
internal/debug: APIs for profiling and tracing
The debug package provides an RPC wrapper for glog settings and the debugging facilities of the Go runtime. They can be triggered through both command line flags and the IPC listener.
Diffstat (limited to 'cmd')
-rw-r--r--cmd/geth/main.go28
-rw-r--r--cmd/geth/usage.go13
-rw-r--r--cmd/utils/flags.go60
3 files changed, 23 insertions, 78 deletions
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index e6d190914..09c7eee05 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -20,7 +20,6 @@ package main
import (
"fmt"
"io/ioutil"
- _ "net/http/pprof"
"os"
"path/filepath"
"runtime"
@@ -34,6 +33,7 @@ import (
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/eth"
+ "github.com/ethereum/go-ethereum/internal/debug"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/metrics"
@@ -326,12 +326,6 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils.VMEnableJitFlag,
utils.NetworkIdFlag,
utils.RPCCORSDomainFlag,
- utils.VerbosityFlag,
- utils.BacktraceAtFlag,
- utils.LogVModuleFlag,
- utils.LogFileFlag,
- utils.PProfEanbledFlag,
- utils.PProfPortFlag,
utils.MetricsEnabledFlag,
utils.SolcPathFlag,
utils.GpoMinGasPriceFlag,
@@ -342,23 +336,29 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils.GpobaseCorrectionFactorFlag,
utils.ExtraDataFlag,
}
+ app.Flags = append(app.Flags, debug.Flags...)
+
app.Before = func(ctx *cli.Context) error {
runtime.GOMAXPROCS(runtime.NumCPU())
+ if err := debug.Setup(ctx); err != nil {
+ return err
+ }
+ // Start system runtime metrics collection
+ go metrics.CollectProcessMetrics(3 * time.Second)
- utils.SetupLogger(ctx)
utils.SetupNetwork(ctx)
utils.SetupVM(ctx)
- if ctx.GlobalBool(utils.PProfEanbledFlag.Name) {
- utils.StartPProf(ctx)
- }
return nil
}
- // Start system runtime metrics collection
- go metrics.CollectProcessMetrics(3 * time.Second)
+
+ app.After = func(ctx *cli.Context) error {
+ logger.Flush()
+ debug.Exit()
+ return nil
+ }
}
func main() {
- defer logger.Flush()
if err := app.Run(os.Args); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index a9fce6418..051c51878 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -23,6 +23,7 @@ import (
"github.com/codegangsta/cli"
"github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/internal/debug"
)
// AppHelpTemplate is the test template for the default, global app help topic.
@@ -147,16 +148,8 @@ var AppHelpFlagGroups = []flagGroup{
},
},
{
- Name: "LOGGING AND DEBUGGING",
- Flags: []cli.Flag{
- utils.VerbosityFlag,
- utils.LogVModuleFlag,
- utils.BacktraceAtFlag,
- utils.LogFileFlag,
- utils.PProfEanbledFlag,
- utils.PProfPortFlag,
- utils.MetricsEnabledFlag,
- },
+ Name: "LOGGING AND DEBUGGING",
+ Flags: append([]cli.Flag{utils.MetricsEnabledFlag}, debug.Flags...),
},
{
Name: "EXPERIMENTAL",
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 9199432d8..1e3e58e51 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -18,20 +18,17 @@ package utils
import (
"crypto/ecdsa"
+ "errors"
"fmt"
"io/ioutil"
- "log"
"math"
"math/big"
- "net/http"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
- "errors"
-
"github.com/codegangsta/cli"
"github.com/ethereum/ethash"
"github.com/ethereum/go-ethereum/accounts"
@@ -223,35 +220,6 @@ var (
}
// logging and debug settings
- VerbosityFlag = cli.IntFlag{
- Name: "verbosity",
- Usage: "Logging verbosity: 0-6 (0=silent, 1=error, 2=warn, 3=info, 4=core, 5=debug, 6=debug detail)",
- Value: int(logger.InfoLevel),
- }
- LogFileFlag = cli.StringFlag{
- Name: "logfile",
- Usage: "Log output file within the data dir (default = no log file generated)",
- Value: "",
- }
- LogVModuleFlag = cli.GenericFlag{
- Name: "vmodule",
- Usage: "Per-module verbosity: comma-separated list of <module>=<level>, where <module> is file literal or a glog pattern",
- Value: glog.GetVModule(),
- }
- BacktraceAtFlag = cli.GenericFlag{
- Name: "backtrace",
- Usage: "Request a stack trace at a specific logging statement (e.g. \"block.go:271\")",
- Value: glog.GetTraceLocation(),
- }
- PProfEanbledFlag = cli.BoolFlag{
- Name: "pprof",
- Usage: "Enable the profiling server on localhost",
- }
- PProfPortFlag = cli.IntFlag{
- Name: "pprofport",
- Usage: "Profile server listening port",
- Value: 6060,
- }
MetricsEnabledFlag = cli.BoolFlag{
Name: metrics.MetricsEnabledFlag,
Usage: "Enable metrics collection and reporting",
@@ -297,7 +265,7 @@ var (
Value: DirectoryString{common.DefaultIpcPath()},
}
WSEnabledFlag = cli.BoolFlag{
- Name: "ws",
+ Name: "ws",
Usage: "Enable the WS-RPC server",
}
WSListenAddrFlag = cli.StringFlag{
@@ -324,6 +292,7 @@ var (
Name: "exec",
Usage: "Execute JavaScript statement (only in combination with console/attach)",
}
+
// Network Settings
MaxPeersFlag = cli.IntFlag{
Name: "maxpeers",
@@ -714,19 +683,6 @@ func MakeSystemNode(name, version string, extra []byte, ctx *cli.Context) *node.
return stack
}
-// SetupLogger configures glog from the logging-related command line flags.
-func SetupLogger(ctx *cli.Context) {
- glog.SetV(ctx.GlobalInt(VerbosityFlag.Name))
- glog.CopyStandardLogTo("INFO")
- glog.SetToStderr(true)
- if ctx.GlobalIsSet(LogFileFlag.Name) {
- logger.New("", ctx.GlobalString(LogFileFlag.Name), ctx.GlobalInt(VerbosityFlag.Name))
- }
- if ctx.GlobalIsSet(VMDebugFlag.Name) {
- vm.Debug = ctx.GlobalBool(VMDebugFlag.Name)
- }
-}
-
// SetupNetwork configures the system for either the main net or some test network.
func SetupNetwork(ctx *cli.Context) {
switch {
@@ -746,6 +702,9 @@ func SetupVM(ctx *cli.Context) {
vm.EnableJit = ctx.GlobalBool(VMEnableJitFlag.Name)
vm.ForceJit = ctx.GlobalBool(VMForceJitFlag.Name)
vm.SetJITCacheSize(ctx.GlobalInt(VMJitCacheFlag.Name))
+ if ctx.GlobalIsSet(VMDebugFlag.Name) {
+ vm.Debug = ctx.GlobalBool(VMDebugFlag.Name)
+ }
}
// MakeChain creates a chain manager from set command line flags.
@@ -873,10 +832,3 @@ func StartWS(stack *node.Node, ctx *cli.Context) error {
glog.V(logger.Error).Infof("Unable to start RPC-WS interface, could not find admin API")
return errors.New("Unable to start RPC-WS interface")
}
-
-func StartPProf(ctx *cli.Context) {
- address := fmt.Sprintf("localhost:%d", ctx.GlobalInt(PProfPortFlag.Name))
- go func() {
- log.Println(http.ListenAndServe(address, nil))
- }()
-}