go - 如何为特定的goroutine设置断点?

标签 go delve

我正在尝试调试一个简单的golang程序,但不知道如何在delve中的特定goroutine上设置断点调试器。

这是一个例子:

package main

import "fmt"

func adder(a int, b int, res_chan chan int) {
    c := a + b
    res_chan <- c
}

func main() {
    chan1 := make(chan int)
    chan2 := make(chan int)

    go adder(0, 1, chan1)
    go adder(0, 2, chan2)

    res1 := <-chan1
    res2 := <-chan2

    fmt.Printf("Channel 1: %d\nChannel 2: %d\n", res1, res2)
}

我进行dlv 调试:

Type 'help' for list of commands.

在 goroutine 上设置断点,这里我直观地假设调试器将停止两次(在每个调用的 goroutine 上):

(dlv) b main.adder
Breakpoint 1 set at 0x49dd1f for main.adder() ./adder.go:5
(dlv) c
> main.adder() ./adder.go:5 (hits goroutine(18):1 total:2) (PC: 0x49dd1f)
> main.adder() ./adder.go:5 (hits goroutine(19):1 total:2) (PC: 0x49dd1f)
     1: package main
     2:
     3: import "fmt"
     4:
=>   5: func adder(a int, b int, res_chan chan int) {
     6:         c := a + b
     7:         res_chan <- c
     8: }
     9:
    10: func main() {
(dlv) s
> main.adder() ./adder.go:6 (PC: 0x49dd2d)
     1: package main
     2:
     3: import "fmt"
     4:
     5: func adder(a int, b int, res_chan chan int) {
=>   6:         c := a + b
     7:         res_chan <- c
     8: }
     9:
    10: func main() {
    11:         chan1 := make(chan int)
(dlv) 
> main.adder() ./adder.go:7 (PC: 0x49dd3c)
     2:
     3: import "fmt"
     4:
     5: func adder(a int, b int, res_chan chan int) {
     6:         c := a + b
=>   7:         res_chan <- c
     8: }
     9:
    10: func main() {
    11:         chan1 := make(chan int)
    12:         chan2 := make(chan int)

检查c变量的值:

(dlv) p c
2

继续执行:

(dlv) c
Channel 1: 1
Channel 2: 2
Process 8112 has exited with status 0

退出调试器:

(dlv) q
Process 8112 has exited with status 0

因此,结果为 1 的 goroutine 没有被调试器命中。 如何调试 goroutine 中的代码执行结果 1

最佳答案

我使用了带条件的断点:

运行dlv debug:

Type 'help' for list of commands.

在一行上设置一个断点,其中goroutine可以通过某种条件来识别。在 7 行上,变量 c 已经被求值,因此我们可以在其上构建一个条件。

在第7行设置断点:

(dlv) b adder.go:7
Breakpoint 1 set at 0x49dd3c for main.adder() ./adder.go:7

列出所有断点以便清晰:

(dlv) breakpoints
Breakpoint unrecovered-panic at 0x42a870 for runtime.startpanic() /home/dmytriv/.soft/go/src/runtime/panic.go:591 (0)
        print runtime.curg._panic.arg
Breakpoint 1 at 0x49dd3c for main.adder() ./adder.go:7 (0)

设置断点1的条件:

(dlv) cond 1 c == 1

继续执行:

(dlv) c

这里断点被命中:

> main.adder() ./adder.go:7 (hits goroutine(5):1 total:1) (PC: 0x49dd3c)
     2:
     3: import "fmt"
     4:
     5: func adder(a int, b int, res_chan chan int) {
     6:         c := a + b
=>   7:         res_chan <- c
     8: }
     9:
    10: func main() {
    11:         chan1 := make(chan int)
    12:         chan2 := make(chan int)

检查c变量的值:

(dlv) p c
1

继续:

(dlv) c
Channel 1: 1
Channel 2: 2
Process 10096 has exited with status 0

退出调试器:

(dlv) q
Process 10096 has exited with status 0

关于go - 如何为特定的goroutine设置断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51535270/

相关文章:

go - 通过在 go 中解码 JSON 文件来创建结构数组

go - 如何构建 Kubernetes 以便将调试信息包含在可执行文件中?

visual-studio - 如何解决错误ld : framework not found CoreFoundation while installing GOPLS?

go - 有没有办法在 golang 的 delve 调试器中查看程序 stdout 和 stderr?

image - 将 multipart.File 放入 image.Decode 作为参数

dictionary - 在 go 中使用 map channel

mysql - Statement.Close 是否影响 mysql 在 golang 中线程安全的 LAST_INSERT_ID?

golang中的json解码用于复杂的json数据

docker - 在容器上调试 Go 进程不会监听映射的端口

debugging - 远程调试 Gogland 停止