[Linux] Debug crash dump:尋找 crash dump 檔案位置、使用 yum 安裝 debug symbol

[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 囉~

找不到的… 就… 再看看囉~~ (完全不負責任啊~~)

 

 

(本頁面已被瀏覽過 535 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料