// Copyright 2021 Evmos Foundation // This file is part of Evmos' Ethermint library. // // The Ethermint library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The Ethermint library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE package debug import ( "os" "os/user" "path/filepath" "runtime/pprof" "strings" "github.com/cosmos/cosmos-sdk/server" "github.com/tendermint/tendermint/libs/log" ) // isCPUProfileConfigurationActivated checks if cpuprofile was configured via flag func isCPUProfileConfigurationActivated(ctx *server.Context) bool { // TODO: use same constants as server/start.go // constant declared in start.go cannot be imported (cyclical dependency) const flagCPUProfile = "cpu-profile" if cpuProfile := ctx.Viper.GetString(flagCPUProfile); cpuProfile != "" { return true } return false } // ExpandHome expands home directory in file paths. // ~someuser/tmp will not be expanded. func ExpandHome(p string) (string, error) { if strings.HasPrefix(p, "~/") || strings.HasPrefix(p, "~\\") { usr, err := user.Current() if err != nil { return p, err } home := usr.HomeDir p = home + p[1:] } return filepath.Clean(p), nil } // writeProfile writes the data to a file func writeProfile(name, file string, log log.Logger) error { p := pprof.Lookup(name) log.Info("Writing profile records", "count", p.Count(), "type", name, "dump", file) fp, err := ExpandHome(file) if err != nil { return err } f, err := os.Create(fp) if err != nil { return err } if err := p.WriteTo(f, 0); err != nil { if err := f.Close(); err != nil { return err } return err } return f.Close() }