stacktrace.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2019, Psiphon Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. */
  19. /*
  20. Package stacktrace provides helpers for handling stack trace information.
  21. */
  22. package stacktrace
  23. import (
  24. "fmt"
  25. "runtime"
  26. "strings"
  27. )
  28. // GetFunctionName is a helper that extracts a simple function name from
  29. // full name returned by runtime.Func.Name(). This is used to declutter
  30. // error messages containing function names.
  31. func GetFunctionName(pc uintptr) string {
  32. funcName := runtime.FuncForPC(pc).Name()
  33. index := strings.LastIndex(funcName, "/")
  34. if index != -1 {
  35. funcName = funcName[index+1:]
  36. }
  37. return funcName
  38. }
  39. // GetParentFunctionName returns the caller's parent function name and source
  40. // file line number.
  41. func GetParentFunctionName() string {
  42. pc, _, line, _ := runtime.Caller(2)
  43. return fmt.Sprintf("%s#%d", GetFunctionName(pc), line)
  44. }