debugging - gdb如何在go程序中打印var的地址?
问题描述
我成功安装了 gdb 8.0.1 并使其在 mac os x 中运行。调试此程序时,我看不到key
.
package main
func main(){
m := map[string]int{
"abc":123,
}
key := []byte("abc")
x, ok := m[string(key)]
println(x, ok)
}
这是我对 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'}
我看一下lldb。(lldb 需要 bmain.main
然后 b 在线)
(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)
我的问题是如何key
在 gdb 中显示地址?
解决方案
你可以为 Go 禁用 Python 漂亮的打印机,然后你会得到这个:
(gdb) print key
$1 = {array = 0xc42003de10 "abc", len = 3, cap = 32}
或者你可以暂时切换到 C 语言,像这样:
(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)
这假设 Go 数组在 C 模式下由 GDB 以某种方式解释,但在这种情况下似乎可以工作。
推荐阅读
- c - 如何打印每个输入的总和?
- javascript - Firestore 使用异步等待获取帖子标题
- docker - Docker hub:在 github 的自动构建中处理第三方工具版本控制的最佳方法是什么?
- python - 具有恒定的手动设置相关性的 SKlearn 高斯过程
- scala - 随着数组大小的增加,Scala 代码变慢
- python - 用函数的结果替换值
- apache - 如何在 htaccess 中仅删除一个 .php 文件的 https 重定向
- r - 尝试运行 ols_correlations 但不断遇到错误消息
- c# - C# Base64Url 将字节数组转换为预分配的字符数组
- laravel - Eloquent 中的嵌套选择