

lldbを使って下記のコード内の`c`という変数をwatchしたいのですが、Errorが起きてうまくいきません。どうすればいいのでしょうか?

`go build -gcflags "-N -l" forprint.go`と実行した後にlldbに入り、watchすると  
`invalid thread`というErrorが起きます。

OS: OS X 10.11.1  
lldb: lldb-340.4.70  
Go: 1.5.1

forprint.go

[code]

    
    package main
    import "fmt"
    
    func main() {
        c := 1
        for c <= 100 {
            fmt.Println(c)
            c++ // cをwatchしたい
        }
    }
    
    
[/code]


CC BY-SA 3.0
2015-09-23T04:10:20.990
16866
2022-07-26T03:04:55.510
2015-10-24T00:57:29.100
5246
5246
question
go debugging
Golangのデバッグでwatch変数を設定できない


こちらとは環境が異なりますので、回答になるのかどうかは不明です。

`invalid thread` と表示されるのは、プログラムがまだ実行されていない(実行コンテクストが存在しない)から、です。ですので、まずは
breakpoint を main 関数などに設定してプログラムを実行する必要があります。

以下はこちらの環境で watchpoint を設定するまでの流れです。

[code]

    $ go version
    go version go1.4.2 gccgo (Ubuntu 5.1.1-4ubuntu12) 5.1.1 20150504 linux/386
    
    $ go build -gcflags "-N -l" lldb-test.go
    
    $ lldb --version
    lldb version 3.7.0 ( revision )
    
    $ lldb ./lldb-test
    
    (lldb) breakpoint set -n main.main
    (lldb) run
    Process 7837 launched: './lldb-test' (i386)
    Process 7837 stopped
    * thread #1: tid = 7837, 0x080496b5 lldb-test`main.main + 26 at lldb-test.go:6, name = 'lldb-test', stop reason = breakpoint 1.1
        frame #0: 0x080496b5 lldb-test`main.main + 26 at lldb-test.go:6
       3    import "fmt"
       4
       5    func main() {
    -> 6        c := 1
       7        for c <= 100 {
       8            fmt.Println(c)
       9            c++ // cをwatchしたい
    
    (lldb) fr variable
    (int) c = 134519177
    
    (lldb) watchpoint set variable c
    Watchpoint created: Watchpoint 1: addr = 0xb5fcffec size = 4 state = enabled type = w
        declare @ '/home/nemo/lldb-test.go:6'
        watchpoint spec = 'c'
        new value: 134519177
    (lldb) watchpoint list
    Number of supported hardware watchpoints: 4
    Current watchpoints:
    Watchpoint 1: addr = 0xb5fcffec size = 4 state = enabled type = w
        declare @ '/home/nemo/lldb-test.go:6'
        watchpoint spec = 'c'
        new value: 134519177
    
    (lldb) cont
    Process 7837 resuming
    Watchpoint 1 hit:
    old value: 134519177   <-- 1st
    new value: 1
    Process 7837 stopped
    * thread #1: tid = 7837, 0x080496bc lldb-test`main.main + 33 at lldb-test.go:7, name = 'lldb-test', stop reason = watchpoint 1
        frame #0: 0x080496bc lldb-test`main.main + 33 at lldb-test.go:7
       4
       5    func main() {
       6        c := 1
    -> 7        for c <= 100 {
       8            fmt.Println(c)
       9            c++ // cをwatchしたい
       10       }
    
    (lldb) cont
    Process 7837 resuming
    Watchpoint 1 hit:
    old value: 1   <-- 2nd
    new value: 2
    Process 7837 stopped
    * thread #3: tid = 7893, 0x08049742 lldb-test`main.main + 167 at lldb-test.go:7, name = 'lldb-test', stop reason = watchpoint 1
        frame #0: 0x08049742 lldb-test`main.main + 167 at lldb-test.go:7
       4
       5    func main() {
       6        c := 1
    -> 7        for c <= 100 {
       8            fmt.Println(c)
       9            c++ // cをwatchしたい
       10       }
    
[/code]

**追記(2015/12/23)**

lldb のバージョンが 3.8 になっていましたので試してみました。

[code]

    ## 今回は amd64 CPU
    $ uname -srm
    Linux 4.2.0-22-generic x86_64
    
    ## golang 1.6 Beta 1 相当
    $ go version
    go version devel +97f854c Sat Dec 19 10:00:04 2015 +0000 linux/amd64
    
    $ lldb --version
    lldb version 3.8.0 ( revision )
    
[/code]

この環境で上記と同じ手順でデバッグを行ったところ、結果は同じで問題はありませんでした。


CC BY-SA 3.0
2015-09-23T09:28:19.760
16877
2015-12-23T03:27:06.197
2015-12-23T03:27:06.197
16866
answer