delve調(diào)試運(yùn)行時(shí)go程序

環(huán)境和代碼參考gdb調(diào)試篇

delve是go官方推薦的一個(gè)調(diào)試器,由go語(yǔ)言開發(fā),也被很多代碼編輯器集成為debug的插件,比如goland,vscode
官方文檔戳這里

程序例子

環(huán)境和代碼參考gdb調(diào)試篇

delve安裝

delve安裝參考環(huán)境安裝篇

調(diào)試go運(yùn)行時(shí)程序

  • 啟動(dòng)程序
    go run test.gogo build -o test test.go
  • 調(diào)試程序
    • 連接運(yùn)行時(shí)程序
      dlv attach `ps aux|grep test|grep -v "grep"|awk  '{print $2}'`
      
    • 查看當(dāng)前進(jìn)程所有線程信息(即MPG中的M)
      (dlv) threads
      * Thread 130 at 0x45f0a3 .usr/local/go/src/runtime/sys_linux_amd64.s:536 runtime.futex
      ......
          Thread 136 at 0x45f250 .usr/local/go/src/runtime/sys_linux_amd64.s:675 runtime.epollwait
      
    • 切換線程
      (dlv) thread 135
      Switched from 130 to 135
      
    • 查看當(dāng)前線程棧詳細(xì)信息
      (dlv) stack
      0  0x000000000045f0a3 in runtime.futex at .usr/local/go/src/runtime/sys_linux_amd64.s:536
         ......
      7  0x0000000000401893 in ??? at ?:-1
      
    • 查看當(dāng)前線程運(yùn)行棧中的某一個(gè)函數(shù)信息
      (dlv) frame 1
      > runtime.futex() .usr/local/go/src/runtime/sys_linux_amd64.s:536 (PC: 0x45f0a3)
      Warning: debugging optimized function
      Frame 1: .usr/local/go/src/runtime/os_linux.go:63 (PC: 42c4b2)
      58:           ts.set_nsec(int32(ns % 1000000000))
      59:       } else {
      60:           ts.tv_nsec = 0
      61:           ts.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ts.tv_nsec)))))
      62:       }
      =>  63:     futex(unsafe.Pointer(addr), _FUTEX_WAIT_PRIVATE, val, unsafe.Pointer(&ts), nil, 0)
      64:   }
      65:
      66:   // If any procs are sleeping on addr, wake up at most cnt.
      67:   //go:nosplit
      68:   func futexwakeup(addr *uint32, cnt uint32) {
      
    • 查看所有的協(xié)程
      (dlv) goroutines #或者grs
        Goroutine 1 - User: .root/go/src/github.com/saileifeng/go-socket-test/example/test/test.go:41 main.ShutDownHook (0x735829)
        Goroutine 2 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
        Goroutine 3 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
        Goroutine 4 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
        Goroutine 6 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
        Goroutine 18 - User: .usr/local/go/src/runtime/sigqueue.go:139 os/signal.signal_recv (0x44450c)
        Goroutine 19 - User: .usr/local/go/src/runtime/netpoll.go:182 internal/poll.runtime_pollWait (0x42b0a6)
        Goroutine 20 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 21 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 22 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 23 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 24 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 25 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 26 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 27 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 28 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 29 - User: .usr/local/go/src/runtime/sema.go:71 sync.runtime_SemacquireMutex (0x4402ad)
        Goroutine 30 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
        Goroutine 31 - User: .usr/local/go/src/runtime/proc.go:302 runtime.gopark (0x43036f)
      [19 goroutines]
      
    • 切換協(xié)程
      (dlv) goroutine 1   #或者gr 1
      Switched from 0 to 1 (thread 131) #可以看到當(dāng)前協(xié)程是在131線程上被運(yùn)行
      
    • 查看協(xié)程棧信息
      (dlv) goroutine 1 stack #或者直接stack
      0  0x000000000043036f in runtime.gopark
         at .usr/local/go/src/runtime/proc.go:302
      1  0x00000000004075a0 in runtime.goparkunlock
         at .usr/local/go/src/runtime/proc.go:307
      2  0x00000000004075a0 in runtime.chanrecv
         at .usr/local/go/src/runtime/chan.go:524
      3  0x000000000040727b in runtime.chanrecv1
         at .usr/local/go/src/runtime/chan.go:406
      4  0x0000000000735829 in main.ShutDownHook
         at .root/go/src/github.com/saileifeng/go-socket-test/example/test/test.go:41
      5  0x0000000000735747 in main.main
         at .root/go/src/github.com/saileifeng/go-socket-test/example/test/test.go:34
      6  0x000000000042ff7c in runtime.main
         at .usr/local/go/src/runtime/proc.go:200
      7  0x000000000045d241 in runtime.goexit
         at .usr/local/go/src/runtime/asm_amd64.s:1337
      
    • 查看協(xié)程棧中運(yùn)行的函數(shù)詳細(xì)信息
      (dlv) gr 1 frame 4
      

待續(xù)......

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容