调试与分析
一、獲取內(nèi)核轉(zhuǎn)儲(chǔ)
大多數(shù)Linux發(fā)行版默認(rèn)關(guān)閉內(nèi)核轉(zhuǎn)儲(chǔ)功能,可使用 ulimit -c 查看,-c 表示內(nèi)核轉(zhuǎn)儲(chǔ)文件的大小限制,如果為0,表示未開啟。
1、可設(shè)置為 ulimit -c unlimited 表示無限制,或設(shè)置為其它數(shù)值,單位是字節(jié),立即生效。
2、修改?/etc/security/limits.conf 文件,重啟后生效。
開啟該功能后,當(dāng)程序異常終止時(shí),會(huì)在當(dāng)前目錄下生成 core.pid ?的內(nèi)核轉(zhuǎn)儲(chǔ)文件。通過 ?gdb -c core.pid ?./a.out ?就可以啟動(dòng)調(diào)試。
修改 coredump 的路徑和格式:
1、修改配置文件/etc/sysctl.conf (重啟后生效,也可以使用 sysctl -p 命令使其立即生效),如:
2、使用命令直接改寫內(nèi)存(可立即生效,但重啟后失效),如:
echo "core" > /proc/sys/kernel/core_pattern echo "0" > /proc/sys/kernel/core_uses_pid注:core_pattern 可以設(shè)置為 ?/var/core/%e_%t.core ,從而定制了 core 文件的統(tǒng)一路徑和命令規(guī)則(%e:執(zhí)行文件名稱;%t:產(chǎn)生 core 文件時(shí)間戳)
?
?
二、gdb 附加到正在運(yùn)行的進(jìn)程
attach pid ,調(diào)試完之后,使用 detach 即可以和進(jìn)程分離。
?
?
加上 -g 選項(xiàng)編譯生成的可執(zhí)行文件(如 a.out),運(yùn)行后在掛掉時(shí),會(huì)向 /var/log/message 文件中寫入地址信息(即 IP 指向的值,如 40052e?),通過 addr2line -e a.out 40052e 就可以輸出錯(cuò)誤發(fā)生在哪個(gè)文件的哪一行中。注:如果沒有向?/var/log/message 寫入信息,請(qǐng)查看 syslog 服務(wù)有沒有啟動(dòng),CentOS6.4 下,需要 /etc/init.d/rsyslog restart
?
?
?
?
?
?
gcc -pg test.cpp -o test //編譯和鏈接時(shí)都需要加上 -pg 參數(shù)
./test //生成 gmon.out 文件
wget http://gprof2dot.jrfonseca.googlecode.com/git/gprof2dot.py
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
gprof ./test gmon.out >report.txt //生成報(bào)告文件
gprof2dot report.txt > test.dot //生成 dot 文件
dot test.dot -Tpng -o test.png //將 dot 文件生成圖片
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/tianyajuanke/p/3374953.html
總結(jié)
- 上一篇: 做梦梦到水管漏水是什么意思
- 下一篇: DEFINE_PER_CPU