Stay Hungry.Stay Foolish.
使用GDB调试Golang二进制

在Golang里面字符串的实现是一个struct,大概就是这样的定义

type GoString struct {
    value string
    len     int
}

所以Go的字符串占用了16个字节来描述,我想这样做的原因是使得len(str)的操作可以始终保持的O(1)的时间复杂度得到。

今天使用GDB来调试直观的感受下字符串的内存存储,测试代码如下

package main
import (
    "fmt"
    "unsafe"
)

func main() {
    s := "hello,world"
    p := &s
    fmt.Println(s, p, unsafe.Sizeof(s))
    fmt.Println("break")
}

Makefile如下

all:
    @go build -gcflags "-N -l" hello.go
    @gdb ./hello

载入GDB之后,我们在fmt.Println(“break”)那一行下断,得到s的内存地址 ,我这里得到的地址是0xc82006aba0 然后查看地址的内容,使用x/20x 0xc82006aba0命令 字符串一共16个字节,前8个字节是字符串实际保持内容的内存地址,后8个字节是字符串的长度。 我这里可以看到字符串地址是0x00000000007052f0,字符串长度是0x000000000000000b(“hello,world”这个字符串的长度刚好是11个字节,也就是0x0b),最后我们查看0x00000000007052f0处的内容,查看字符串实际存储,使用命令x/20x 0x00000000007052f0 我这里得到的是0x7052f0: 0x6f772c6f6c6c6568 0x0000000000646c72 我的CPU是Intel的,所以小端模式(低地址放低位,高地址放高位), 字符串”hello,world”中h被分配在最低的地址,所以对应到0x68,类推。

自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
评论

暂无评论~~