當前位置:編程學習大全網 - 編程語言 - 調試Go語言的核心轉儲(Core Dumps)

調試Go語言的核心轉儲(Core Dumps)

英文原文鏈接Go, the unwritten parts 發表於2017/05/22 作者JBD是Go語言開發小組成員

檢查程序的執行路徑和當前狀態是非常有用的調試手段。核心文件(core file)包含了壹個運行進程的內存轉儲和狀態。它主要是用來作為事後調試程序用的。它也可以被用來查看壹個運行中的程序的狀態。這兩個使用場景使調試文件轉儲成為壹個非常好的診斷手段。我們可以用這個方法來做事後診斷和分析線上的服務(production services)。

在這篇文章中,我們將用壹個簡單的hello world網站服務作為例子。在現實中,我們的程序很容易就會變得很復雜。分析核心轉儲給我們提供了壹個機會去重構程序的狀態並且查看只有在某些條件/環境下才能重現的案例。

作者註 : 這個調試流程只在Linux上可行。我不是很確定它是否在其它Unixs系統上工作。macOS對此還不支持。Windows現在也不支持。

在我們開始前,需要確保核心轉儲的ulimit設置在合適的範圍。它的缺省值是0,意味著最大的核心文件大小是0。我通常在我的開發機器上將它設置成unlimited。使用以下命令:

接下來,妳需要在妳的機器上安裝 delve 。

下面我們使用的 main.go 文件。它註冊了壹個簡單的請求處理函數(handler)然後啟動了HTTP服務。

讓我們編譯並生產二進制文件。

現在讓我們假設,這個服務器出了些問題,但是我們並不是很確定問題的根源。妳可能已經在程序裏加了很多輔助信息,但還是無法從這些調試信息中找出線索。通常在這種情況下,當前進程的快照會非常有用。我們可以用這個快照深入查看程序的當前狀態。

有幾個方式來獲取核心文件。妳可能已經熟悉了奔潰轉儲(crash dumps)。它們是在壹個程序奔潰的時候寫入磁盤的核心轉儲。Go語言在缺省設置下不會生產奔潰轉儲。但是當妳把 GOTRACEBACK 環境變量設置成“crash”,妳就可以用 Ctrl+backslash 才觸發奔潰轉儲。如下圖所示:

上面的操作會使程序終止,將堆棧跟蹤(stack trace)打印出來,並把核心轉儲文件寫入磁盤。

另外個方法可以從壹個運行的程序獲得核心轉儲而不需要終止相應的進程。 gcore 可以生產核心文件而無需使運行中的程序退出。

根據上面的操作,我們獲得了轉儲而沒有終止對應的進程。下壹步就是把核心文件加載進delve並開始分析。

差不多就這些。delve的常用操作都可以使用。妳可以backtrace,list,查看變量等等。有些功能不可用因為我們使用的核心轉儲是壹個快照而不是正在運行的進程。但是程序執行路徑和狀態全部可以訪問。

  • 上一篇:20條常見的編碼陷阱之JavaScript篇
  • 下一篇:什麽是數字手抄報?
  • copyright 2024編程學習大全網