我的main.go:
package main
import "fmt"
// main
func main() {
fmt.Println("hello")
}
构建它:
go build -o main -gcflags '-N -l'
命中断点:
gdb main
b runtime.(*mheap).sysAlloc
r
在第540行,我打印v,它使我“被优化”。
在第549行的打印提示处,它给我:在当前上下文中没有符号“提示”。
奇怪的是,我可以打印* h.arenaHints值,该值可以推断hint.down为false,但是第550行仍会进入。
535 func (h *mheap) sysAlloc(n uintptr) (v unsafe.Pointer, size uintptr) {
536 n = round(n, heapArenaBytes)
537
538 // First, try the arena pre-reservation.
539 v = h.arena.alloc(n, heapArenaBytes, &memstats.heap_sys)
540 if v != nil {
541 size = n
542 goto mapped
543 }
544
545 // Try to grow the heap at a hint address.
546 for h.arenaHints != nil {
547 hint := h.arenaHints
548 p := hint.addr
549 if hint.down {
550 p -= n
551 }
那么为什么禁用优化失败?为什么可以插入550行?
Env:
golang 1.12
ubuntu 18.04