相关疑难解决方法(0)

如何获得恐慌的堆栈跟踪(并存储为变量)

众所周知,恐慌会产生一个堆栈跟踪到stdout(Playground链接):

panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
    /tmp/sandbox579134920/main.go:9 +0x20
Run Code Online (Sandbox Code Playgroud)

当你从恐慌中恢复时,似乎recover()只返回error描述导致恐慌的原因(游乐场链接).

runtime error: index out of range
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以存储写入stdout的堆栈跟踪?这提供了比字符串更好的调试信息,runtime error: index out of range因为它显示文件中引起恐慌的确切行.

debugging go panic

17
推荐指数
2
解决办法
6086
查看次数

如何转储所有Go进程的堆栈?

Go进程正在运行.我想要

  1. 转储每个goroutine的堆栈跟踪
  2. 从外部,不依赖于我添加到其源代码中的任何内容
  3. 没有杀死它.

我怎样才能做到这一点?

这应该很简单 - 请求功能:https://code.google.com/p/go/issues/detail?id = 2516,并根据该主题的结论,实施.那是两年多以前的事了.但是问题线程和提交都没有包含关于如何调用此功能的任何提示.

功能请求提到SIGQUIT调用JVM上的相应功能,但事实并非如此; 至少在go1.2上,SIGQUIT做#1和#2但也杀死了这个过程.

有人在前面问了一个相关的问题:如何转储goroutine stacktraces? 但他们没有明确要求#2或#3,没有一个答案符合#2,他们接受了不符合#2的答案.所以这是一个不同的问题.

go

10
推荐指数
2
解决办法
4581
查看次数

如何调试用golang编写的死锁进程

我有一个用golang编写的进程作为守护进程运行.

几天后,它没有明显的原因停止产量.我认为这可能是一个内部僵局.如果我这样做,strace -p <PID>我可以看到这条线

futex(0x9aaba0, FUTEX_WAIT, 0, NULL
Run Code Online (Sandbox Code Playgroud)

显然这个电话永远不会结束.我想使用已经运行的进程(因为我不知道如何/何时再次触发错误)来调试问题.

我怎样才能看到正在运行的goroutine以及它们在哪里?如何从进程中转储任何其他信息可能对调试问题有用?

go

6
推荐指数
1
解决办法
3780
查看次数

测试Golang Goroutine

我一直在寻找周围,但到目前为止只进行了类似的文章写到这里通过Ariejan德弗鲁姆.

我想知道我是否可以将goroutine引入单元测试,以便它可以精确计算正在运行的goroutine的并发数量,并且可以告诉我它们是否正确地产生了我所说的数字goroutine.

我有以下代码例如..

import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func createList(job int, done chan bool) {
    time.Sleep(500)
    // do something
    time.Sleep(500)
    done <- true
    return
}

func TestNewList(t *testing.T) {
  list := NewList()
  if assert.NotNil(t, list) {
    const numGoRoutines = 16
    jobs := make(chan int, numGoRoutines)
    done := make(chan bool, 1)

    for j := 1; j <= numGoRoutines; j++ {
        jobs <- j
        go createList(j, done)
        fmt.Println("sent job", j)
    }
    close(jobs)
    fmt.Println("sent all jobs")
    <-done
}
Run Code Online (Sandbox Code Playgroud)

tdd unit-testing go goroutine

6
推荐指数
1
解决办法
5979
查看次数

是否有工具可以检测何时忘记关闭goroutines?

当我这样做

done := make(chan bool)
for i := 0; i < 10; i++ {
    go func() {
        done <- true
    }()
}
<-done
Run Code Online (Sandbox Code Playgroud)

而不是这个

done := make(chan bool)
for i := 0; i < 10; i++ {
    go func() {
        done <- true
    }()
}
for i := 0; i < 10; i++ {
    <-done
}
Run Code Online (Sandbox Code Playgroud)

如果我不关闭它们,我会泄漏goroutines吗?有什么工具可以检测我何时忘记关闭goroutines?

go

5
推荐指数
1
解决办法
828
查看次数

如何防止Go程序意外panic后崩溃?

想象一个大型项目,它处理由其自己的 goroutine 处理的大量并发请求。碰巧代码中存在错误,其中一个请求将因零引用而导致恐慌。

在 Java、C# 和许多其他语言中,这最终会导致异常,该异常会停止请求,而不会对其他正常请求造成任何损害。在 Go 中,这会使整个程序崩溃。

AFAIK,我必须recover()为每一个新的 goroutine 创建。这是防止整个程序崩溃的唯一方法吗?

更新:recover()为每个 gorouting 创建添加调用似乎没问题。第三方库呢?如果第三方在没有recover()安全网的情况下创建 goroutine,似乎没有什么可做的。

go

5
推荐指数
1
解决办法
5812
查看次数

标签 统计

go ×6

debugging ×1

goroutine ×1

panic ×1

tdd ×1

unit-testing ×1