在GDB中展开goroutine的堆栈,用于golang exe的核心转储

时间:2017-08-24 07:26:28

标签: go gdb core

我需要分析一些用Golang编写的服务器的核心转储文件。但我无法使用GDB解开堆栈信息(甚至是一些有用的信息)。

例如,我有一个main.go,其代码是:

package main

func main(){
    panic("stupid")
}

我使用以下内容获取核心文件:

ulimit -c unlimited
GOTRACEBACK=crash ./main

然后我运行gdb main core。然后在gdb中运行以下内容。

xxx@ubuntu:/tmp/crash$ gdb main core
GNU gdb (Ubuntu 7.12.50.20170314-0ubuntu1.1) 7.12.50.20170314-git
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
[New LWP 5735]
[New LWP 5736]
[New LWP 5738]
[New LWP 5739]
[New LWP 5737]
Core was generated by `./main'.
Program terminated with signal SIGABRT, Aborted.
#0  runtime.raise () at /usr/lib/go-1.7/src/runtime/sys_linux_amd64.s:110
110        RET
[Current thread is 1 (LWP 5735)]
(gdb) source /usr/share/go-1.7/src/runtime/runtime-gdb.py
Loading Go Runtime support.
(gdb) info goroutines
* 1 running  runtime.systemstack_switch
  2 waiting  runtime.gopark
  3 waiting  runtime.gopark
(gdb) goroutine 1 bt
Python Exception <class 'gdb.error'> You can't do that without a process to debug.: 
Error occurred in Python command: You can't do that without a process to debug.
(gdb) goroutine 1 info r
Python Exception <class 'gdb.error'> You can't do that without a process to debug.: 
Error occurred in Python command: You can't do that without a process to debug.

我在这里找到issue,但它没有给我一个解决方案,所以任何人都可以告诉我如何查看核心转储中的堆栈跟踪等goroutine信息?感谢任何解决方案,谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,gdb中的golang支持非常弱。通常最好使用delve调试器。

dlv core ./hello core.546
> bt
> ls

delve调试器的命令名是dlv。使用bt,你得到一个回溯,并列出代码/程序集的相应部分。

有关调试器的信息,请访问https://github.com/derekparker/delve