【问题标题】:how to use gdb debug golang code to see what's inside channel?如何使用 gdb 调试 golang 代码来查看通道内的内容?
【发布时间】:2015-03-16 19:52:28
【问题描述】:

例如我有这个代码

http://play.golang.org/p/9U22NfrXeq

// A concurrent prime sieve

package main

// Send the sequence 2, 3, 4, ... to channel 'ch'.
func Generate(ch chan<- int) {
    for i := 2; ; i++ {
        ch <- i // Send 'i' to channel 'ch'.
    }
}

// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func Filter(in <-chan int, out chan<- int, prime int) {
    for {
        i := <-in // Receive value from 'in'.
        if i%prime != 0 {
            out <- i // Send 'i' to 'out'.
        }
    }
}

// The prime sieve: Daisy-chain Filter processes.
func main() {
    ch := make(chan int) // Create a new channel.
    go Generate(ch)      // Launch Generate goroutine.
    for i := 0; i < 10; i++ {
        prime := <-ch
        print(prime, "\n")
        ch1 := make(chan int)
        go Filter(ch, ch1, prime)
        ch = ch1
    }
}

如何查看频道内的内容? 例如我想调试这一行:

prime := <-ch

在 gdb 中输入 'p ch' 只会打印通道的地址。如何获取内容?

【问题讨论】:

    标签: debugging concurrency go gdb channel


    【解决方案1】:

    你只需要取消引用 ch.用一个非常小的程序:

    package main
    
    func main() {
        ch := make(chan int, 10)
        ch <- 1
        ch <- 2
        ch <- 4
        <-ch
    }
    

    调试:

    (gdb) p *ch
    $1 = struct hchan<int> = {1, 2, 4}
    

    【讨论】:

    • 更多信息在这里有用,我不了解解决方案,也看不到如何将其集成到使用 OS X 开发工具调试器的 GoLand 等 IDE 调试器中。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 2017-03-27
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多