当前位置: 首页 > 面试题库 >

如何转储goroutine stacktraces?

谷梁存
2023-03-14
问题内容

我有Java背景,并且喜欢使用信号QUIT检查Java线程转储。

如何让Golang打印出所有goroutine堆栈跟踪?


问题答案:

要打印 当前 goroutine
的堆栈跟踪,请使用PrintStack()fromruntime/debug

PrintStack将Stack返回的堆栈跟踪打印到标准错误。

例如:

import(
   "runtime/debug"
)
...    
debug.PrintStack()

要打印 所有 goroutine
的堆栈跟踪,请使用LookupWriteToruntime/pprof

func Lookup(name string) *Profile
// Lookup returns the profile with the given name,
// or nil if no such profile exists.

func (p *Profile) WriteTo(w io.Writer, debug int) error
// WriteTo writes a pprof-formatted snapshot of the profile to w.
// If a write to w returns an error, WriteTo returns that error.
// Otherwise, WriteTo returns nil.

每个配置文件都有一个唯一的名称。预定义了一些配置文件:

goroutine-当前所有goroutine
堆的堆栈跟踪-所有堆分配的采样
threadcreate-导致创建新OS线程
块的堆栈跟踪-导致对同步原语进行阻塞的堆栈跟踪

例如:

pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)


 类似资料:
  • 我一直在处理谷歌驱动器中的自动化脚本的大量数据。这些脚本通过不同的工作表不断更新列中的一些单元格。 现在问题来了:用谷歌脚本读写是超长的。所以我试图通过getValues获取列,将其转储到数组中,在那里进行研究和mod,然后将整个数组写回工作表。 但是,这会删除列中可能包含的公式(getValues将返回公式的结果)。使用getFormulas不会返回值。我可以写和读公式和值,但当我试图节省时间时

  • 我正在尝试将Java进程的Linux核心转储转换为堆转储文件,适合用Eclipse MAT进行分析。根据这篇博客文章,适应于较新的OpenJDK 12,我创建了一个核心转储,然后运行将转储转换为HPROF格式: 核心转储文件是22GB,而堆转储文件只有3MB,因此命令可能无法处理整个核心转储。此外,Eclipse MAT无法打开堆转储文件,并显示以下消息:

  • 问题内容: 我试图了解有关Java的更多信息,尤其是有关内存管理和线程的信息。因此,我最近发现对线程转储感兴趣。 以下是使用VisualVM(适用于Java的内置工具)从Web应用程序摘录的几行内容: 首先,我对一些变量名称有疑问: tid和nid是什么意思? Object.wait之后方括号中的数字是多少? 然后对于堆栈跟踪本身: 这是什么意思 等待 <.....>(一java.lang中...

  • 当我使用Windowscmd.exe时,该命令可以完美运行,但不适用于我的Java应用程序。 例如,逗号是:C:\Program Files(x86)\MySQL\MySQL Server 5.0\bin\mysqldump-uroot-p123 stroe|mysql-uroot-p123store_1401我得到了以下错误: 你有什么想法吗?

  • 问题内容: 我获得了一个MySQL数据库文件,需要将其还原为Windows Server 2008计算机上的数据库。 我尝试使用MySQL Administrator,但出现以下错误: 所选文件是由mysqldump生成的,不能由该应用程序还原。 我该如何工作? 问题答案: 它应该像运行此命令一样简单: 如果转储是单个数据库,则可能必须在文件顶部添加一行: 如果它是许多数据库的转储,则use语句已