gdb 調試入門,大牛寫的高質量指南python
2016/11/23 · 開發 · 1 評論 · Brendan Gregg, GDB, 調試shell
分享到:11Canvas 繪製時鐘創業公司的Nodejs工程師PHP環境LAMP/LNMP安裝與配置輕鬆學會Laravel-基礎篇本文由 伯樂在線 - 道法子 翻譯,艾凌風 校稿。未經許可,禁止轉載!工具
英文出處:Brendan Gregg。歡迎加入翻譯組。性能
沒想到Brendan Gregg這樣的大牛,會寫出這樣一篇gdb tutorials文章:gdb Debugging Full Example (Tutorial): ncurses 。但可能正如文章開頭所說,大牛對網上的gdb文章都不太滿意,因此纔有了這篇高質量指南,gdb入門者的福音。—— 何登成測試
若是你是系統管理員,但還不認識 Brendan Gregg,那網上流傳甚廣的 3 張 Linux 性能工具圖(連接),你應該看過的。—— 伯小樂。url
( Brendan Gregg).net
gdb 調試 ncurses 全過程:翻譯
發現網上的「gdb 示例」只有命令而沒有對應的輸出,我有點不滿意。gdb 是 GNU 調試器,Linux 上的標配調試器。當我看 Greg Law 在 CppCon 2015 上的演講《給我 15 分鐘,我將改變你的對 GDB 的認知》的時候,我想起了示例輸出的不足,幸運的是,此次有輸出!這 15 分鐘太值了。調試
它也啓發我去分享一個完整的 gdb 調試實例,包含輸出和每一個步驟,甚至鑽牛角尖的狀況。這不是一個特別有趣或奇怪的問題,只是常規的 gdb 調試會話。但它包含了基礎的東西能夠勉強做爲教程使用,記住 gdb 裏還有不少東西我這裏沒用到。教程
我會以 root 權限運行下面的命令,由於我在調試一個工具,它須要 root 權限(目前)。須要的時候可用 sudo 獲取 root 權限。你也不必通讀全篇︰ 我已列出每一步,你能夠瀏覽它們找感興趣的看。
1. 問題概述
更多閱讀請點擊:河南治療牛皮癬醫院
更多閱讀請點擊:鄭州牛皮癬
BPF 工具箱裏的 bcc 工具集有一個對cachetop.py 的 pull 請求,它經過程序使用 top-like display 顯示 page cache 的統計。太好了 !然而,當我測試它時,遇到了段錯誤︰
1
2# ./cachetop.py
Segmentation fault
注意它說的是「段錯誤」,不是「段錯誤(核心已轉儲)」。我想要一個核心轉儲文件用來調試。(核心轉儲文件是進程內存的拷貝 – 這個名字來源於磁芯存儲器時代 – 可用調試器分析)
分析核心轉儲文件是一種方法,但不是調試這個問題的惟一方法。我能夠在 gdb 中運行此程序,來檢查這個問題。我也能夠在段錯誤發生時,用外部追蹤器去抓數據和棧幀。咱們從核心轉儲文件入手。
2. 解決核心轉儲問題
我檢查一下核心轉儲的設置:
1
2
3
4# ulimit -c
0
# cat /proc/sys/kernel/core_pattern
core
ulimit -c 顯示核心轉儲文件大小的最大值,這裏是零:禁止核心轉儲(對於本進程和它的子進程)。
/proc/…/core_pattern 僅僅被設爲 「core」,表示會在當前目錄下生成一個文件名爲 「core」 的 核心轉儲文件。目前這樣就好了,可是我要演示如何把它設置爲全局位置。
1
2
3# ulimit -c unlimited
# mkdir /var/cores
# echo "/var/cores/core.%e.%p" > /proc/sys/kernel/core_pattern
你能夠進一步定製 core_pattern;例如,%h 爲主機名,%t 爲轉儲的時間。這些選項被寫在 Linux 內核源碼 Documentation/sysctl/kernel.txt中。
要使 core_pattern 保持不變,重啓以後仍然有效,你能夠經過設置 /etc/sysctl.conf 裏的 「kernel.core_pattern」 實現。
再來一次:
1
2
3
4
5
6
7# ./cachetop.py
Segmentation fault (core dumped)
# ls -lh /var/cores
total 19M
-rw------- 1 root root 20M Aug 7 22:15 core.python.30520
# file /var/cores/core.python.30520
/var/cores/core.python.30520: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from 'python ./cachetop.py'
好多了:咱們有了本身的核心轉儲文件。
3. 啓動 GDB
如今我要用 gdb 啓動目標程序(用 shell 替換符,」`」,不過在你肯定能用的狀況下,也可指定完整路徑),和核心轉儲文件: