gdb 調試入門,大牛寫的高質量指南

  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 替換符,」`」,不過在你肯定能用的狀況下,也可指定完整路徑),和核心轉儲文件:

相關文章
相關標籤/搜索