2014-09-02 4 views
3

У меня есть 2 вопроса о GDB + golang?Отладка Golang с использованием GDB?

1) Go build GCC flags 

Когда я запускаю «go build», какие gcc-флаги используют конструктор Go для создания программы? Значение построения такое же, как и «GOGCCFLAGS», установленное в go envionment?

GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common" 

потому что я не вижу флаги «-g» или «-g3» для добавления символа кода. Если да, как можно скопировать таблицу символов?

2) Как напечатать значение в GDB Я следовал за учебником здесь GDB debug go tutorial, но, похоже, значение не то, что я задал.

The value print 1, while actual is 1024

Кстати, я заметил, что это пост об этом gdb debug go Однако, не работает для меня тоже. the value is not what I set

ответ

4

Go не работает с GDB, и одной из известных проблем является печать значений.

Более подробную информацию можно найти here.

+0

Спасибо, каков вариант вместо GDB? – python

+4

нет другого выхода - посмотрите [здесь] (http://stackoverflow.com/questions/16492509/does-any-golang-interactive-debugger-exist/23387017#23387017) – metakeule

+3

Я попробовал go-1.4.rc2 и, похоже, он работает с gdb. –

9

Golang теперь работает хорошо с GDB

Вот пример golang App gdbtest

- gdbtest/ 
    - main.go 

следующий пример main.go

package main 

import "fmt" 

type MyStruct struct { 
    x string 
    i int 
    f float64 
} 

func main() { 
    x := "abc" 
    i := 3 
    fmt.Println(i) 
    fmt.Println(x) 

    ms := &MyStruct{ 
     x: "cba", 
     i: 10, 
     f: 11.10335, 
    } 
    fmt.Println(ms) 
} 

Сохранить что основной. входить. Затем скомпилируйте флажок gcflag.

go build -gcflags "-N"

Open GDB с недавно построенным golang приложением

gdb gdbtest 
# or 
gdb <PROJECT_NAME> 

Теперь у вас есть полный контроль над GDB. Например, добавить точку останова с br <linenumber> командой, а затем выполнить приложение с run

(gdb) br 22 
Breakpoint 1 at 0x2311: file /go/src/github.com/cevaris/gdbtest/main.go, line 22. 
(gdb) run 
Starting program: /go/src/github.com/cevaris/gdbtest/gdbtest 
3 
abc 

Breakpoint 1, main.main() at /go/src/github.com/cevaris/gdbtest/main.go:22 
22    fmt.Println(ms) 
(gdb) 

Теперь вы можете печатать все локальные переменные

(gdb) info locals 
i = 3 
ms = 0x20819e020 
x = 0xdb1d0 "abc" 

Даже получить доступ к указателям

(gdb) p ms 
$1 = (struct main.MyStruct *) 0x20819e020 
(gdb) p *ms 
$2 = {x = 0xdb870 "cba", i = 10, f = 11.103350000000001} 
Смежные вопросы