[Linux] Debug crash dump:尋找 crash dump 檔案位置、使用 yum 安裝 debug symbol
最近在看一個 Linux 上面 python 程式的 crash dump~
第一個問題是對這環境不熟,只知道上面有 crash dump,
但不知道放在哪裡…
其實這問題解法很簡單,看一下 core(5) – Linux manual page 的說明,
原來 core dump 的位置會寫在 /proc/sys/kernel/core_pattern 這個檔案裡面~
如果內容一開始是 | 的話,表示會送給 | 後面的程式去處理這個 core dump,
如果不是的話,就是直接指定 core dump 儲存的位置了~
舉例來說,下面的內容表示有 core dump 要產生時,
會呼叫 /bin/coredump_save.sh 並把 core dump 檔名設定成 core.<執行檔名稱>.time<時間>.sig<訊號>.pid<程式pid>:
|/bin/coredump_save.sh save core.%e.time%t.sig%s.pid%p
用這方法找到 core dump file 之後,用 gdb 就可以打開 dump,
因為這是 python 程式當掉產生的 dump,因此 gdb 參數要給 python 和 core dump 的路徑:
gdb /usr/bin/python core.python.time12345.sig11.pid678
執行 gdb 之後,遇到的第二個問題就是,缺少 debug symbol…
在執行 gdb 之後,可以看到 “Missing separate debuginfos…” 的訊息,像是:
Missing separate debuginfos, use: debuginfo-install keyutils-libs-1.4-4.el6.x86_64 krb5-libs-1.9-33.el6_3.3.x86_64 libcom_err-1.41.12-12.el6.x86_64 libffi-3.0.5-3.2.el6.x86_64 libgcc-4.4.6-4.el6.x86_64 libidn-1.18-2.el6.x86_64 libstdc++-4.4.6-4.el6.x86_64 libuuid-2.17.2-12.7.el6_3.x86_64 python-pycurl-7.19.0-8.el6.x86_64
當然如果這台 Linux 系統上有安裝 debuginfo 的話,就可以直接複製貼上,
讓 debuginfo 幫忙把 debug symbol 都裝好~
如果沒有 debuginfo 的話,其實也可以自己手動去抓 RPM 下來裝,
或是用 yum 的方式來裝(我自己是比較喜歡 yum 可以幫你處理 dependency 的問題)~
要如何用 yum 安裝 debug symbol 呢?
首先要加上抓 debug symbol 用的 repository,
建立 /etc/yum.repos.d/CentOS-Debuginfo.repo 這個檔案,
然後打入下列的內容(可能要根據 CentOS 的版本修改版本號):
[debug] name=CentOS-6 - Debuginfo baseurl=http://debuginfo.centos.org/6/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6 enabled=1
接著,把 gdb 上面 debuginfo 那一行稍微修改一下,加上 debuginfo- 這個字串,就有可能 OK 了~
舉例來說,想裝 python-pycurl-7.19.0-8.el6.x86_64 的 debug symbol 的話,
只要執行下面的指令:
yum -y install python-pycurl-debuginfo-7.19.0-8.el6.x86_64
有時候 debug symbol 套件的名稱可能跟原本的套件稍微有所不同,
尤其是有 lib 或 libs 這個字的時候…
像是想裝 libgcc-4.4.6-4.el6.x86_64 的 debug symbol 時,就得把 lib 拿掉:
yum -y install gcc-debuginfo-4.4.6-4.el6.x86_64
想裝 keyutils-libs-1.4-4.el6.x86_64 的 debug symbol 時,就得把 libs- 拿掉:
yum -y install keyutils-debuginfo-1.4-4.el6.x86_64
就算以上面的方法,把所有的可能性都產生出來,
還是會有部分的 debug symbol 就是找不到,像是 libuuid-2.17.2-12.7.el6_3.x86_64 的 debug symbol,
不管是搜尋 libuuid-debuginfo-2.17.2-12.7.el6_3.x86_64 或是 uuid-debuginfo-2.17.2-12.7.el6_3.x86_64 都不會找到…
這邊因為我對 Linux debugging 還很淺,就可能得用 Google 找找看了… Orz
但是假設有部分 debug symbol 可以用上述方法找到裝起來的話,
對於分析 crash dump 可能就有些許的幫助了,因為可以多一些 stack 給你看~
下面提供我寫的一個小程式,幫忙把可能的 debug symbol 套件名稱都產生出來,
這樣就只要輸入 debuginfo 後面列出來的套件名稱,
它就會產生一段 yum 的指令來安裝所有相對應的 debug symbol:
#!/usr/bin/env python import re import sys print "" for arg in sys.argv[1:]: for item in arg.split(" "): set_for_item = set() set_for_item.add(item) set_for_item.add(item.replace("-libs-", "-")) set_for_item.add(item.replace("lib", "")) for tmp_item in set_for_item: (left, right) = re.findall("^(.+?-)(\d.+)$", tmp_item)[0] sys.stdout.write("yum -y install " + left + "debuginfo-" + right + "; ") print ""
把這個 python 程式儲存起來成為 gen_yum_debug.py 然後執行,像是:
./gen_yum_debug.py keyutils-libs-1.4-4.el6.x86_64 libgcc-4.4.6-4.el6.x86_64
執行結果為:
yum -y install keyutils-s-debuginfo-1.4-4.el6.x86_64; yum -y install keyutils-libs-debuginfo-1.4-4.el6.x86_64; yum -y install keyutils-debuginfo-1.4-4.el6.x86_64; yum -y install libgcc-debuginfo-4.4.6-4.el6.x86_64; yum -y install gcc-debuginfo-4.4.6-4.el6.x86_64;
再把這一整串結果複製貼上到 terminal 裡面執行,就可以裝好 debug symbol 囉~
找不到的… 就… 再看看囉~~ (完全不負責任啊~~)