How gdb print address of a var in go program?

Multi tool use
How gdb print address of a var in go program?
I success install gdb 8.0.1 and make it run in mac os x. When debug this program I don't see the address of key
.
key
package main
func main(){
m := map[string]int{
"abc":123,
}
key := byte("abc")
x, ok := m[string(key)]
println(x, ok)
}
Here is what I have done with gdb:
go build -gcflags "-N" test_append.go
gdb test_append
(gdb) b 9
Breakpoint 1 at 0x104d4b4: file /Users/jiamo/go/src/test/test_append.go, line 9.
(gdb) c
The program is not being run.
(gdb) run
Starting program: /Users/jiamo/go/src/test/test_append
Thread 3 hit Breakpoint 1, main.main () at /Users/jiamo/go/src/test/test_append.go:9
9 x, ok := m[string(key)]
(gdb) info locals
key = uint8 = {97 'a', 98 'b', 99 'c'}
m = map[string]int = {["abc"] = 123}
ok = false
x = 17195648
(gdb) p key
$1 = uint8 * = {97 'a', 98 'b', 99 'c'}
(gdb) p &key
$2 = uint8 * = {97 'a', 98 'b', 99 'c'}
I give a look at lldb. (lldb need b on main.main
then b on line)
main.main
(lldb) b main.main
Breakpoint 1: where = test_append`main.main + 50 at test_append.go:4, address = 0x000000000104d372
(lldb) run
(lldb) b 9
(lldb) c
(lldb) fr v
(uint8) key = (len 3, cap 32) {
[0] = 97
[1] = 98
[2] = 99
}
# no address too
(lldb) p key
(uint8) key = (len 3, cap 32) {
[0] = 97
[1] = 98
[2] = 99
}
(lldb) p &key
(*uint8) = 0x000000c420055e10 (len 0, cap 0)
# now it can show the address,
# And I am not sure why it becomes (len 0, cap 0)
And my question is how can show the address of key
in gdb?
key
1 Answer
1
You can either disable the Python pretty-printers for Go, then you will get this:
(gdb) print key
$1 = {array = 0xc42003de10 "abc", len = 3, cap = 32}
Or you can temporarily switch to the C language, like this:
(gdb) set language c
Warning: the current language does not match this frame.
(gdb) print key
$1 = uint8 = {97 'a', 98 'b', 99 'c'}
(gdb) print (char *)key
$2 = 0xc420043e10 "abc"
(gdb)
This assumes that Go arrays are interpreted by GDB in a certain way in C mode, but it seems to be to work in this case.
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.