日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学会用core dump调试程序错误

發布時間:2024/4/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学会用core dump调试程序错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最來在項目中遇到大型程序出現SIGSEGV ,一直不知道用core dump工具來調試程序,花了近一周的時間,才定位問題,老大很生氣,后果很嚴重,呵呵,事后仔細學習了這塊的知識,了解一點core dump的知識。

????? 在使用半導體作為內存的材料前,人類是利用線圈當作內存的材料(發明者為王安),線圈就叫作core ,用線圈做的內存就叫作“corememory”。(線圈的單詞應該是coil,呵呵)如今,半導體工業澎勃發展,已經沒有人用線圈當內存了,不過,在許多情況下,人們還是把內存叫作“core”。所以注意了:這里的core不是核心,而是內存。不過結合實際來看,好像也有點“內核所占內存”的意思。
????? core dump又是什么東東? 我們在開發(或使用)一個程序時,最怕的就是程序莫明其妙地掛掉。雖然系統沒事,但我們下次仍可能遇到相同的問題。于是,這時操作系統就會把程序掛掉時的內存內容寫入一個叫做core的文件里(這個寫入的動作就叫dump,dump的英語意思是垃圾、傾倒。從這里來看,這些內存的內容是程序錯誤運行的結果,所以算是垃圾,把他弄出來就好比從大的內存池里“傾倒”。),以便于我們調試。這個過程,因此叫做core dump。

1. 在嵌入式系統中,有時core dump直接從串口打印出來,結合objdump查找ra和epa地址,運用棧回溯,可以找到程序出錯的地方。

2. 在一般Linux系統中,默認是不會產生core dump文件的,通過ulimit -c來查看core dump文件的大小,一般開始是0,可以設置core文件大小,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited。

3. core dump文件輸出設置,一般默認是當前目錄,可以在/proc/sys/kernel中找到core-user-pid,通過

echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid號,還可以用

mkdir -p /root/corefile

echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern控制core文件保存位置和文件名格式。

以下是參數列表:
? ? %p - insert pid into filename 添加pid
? ? %u - insert current uid into filename 添加當前uid
? ? %g - insert current gid into filename 添加當前gid
? ? %s - insert signal that caused the coredump into the filename 添加導致產生core的信號
? ? %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
? ? %h - insert hostname where the coredump happened into filename 添加主機名
? ? %e - insert coredumping executable name into filename 添加命令名

4. 用gdb查看core文件:
下面我們可以在發生運行時信號引起的錯誤時發生core dump了.編譯時加上-g
發生core dump之后, 用gdb進行查看core文件的內容, 以定位文件中引發core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進入gdb后, 用bt命令查看backtrace以檢查發生程序運行到哪里, 來定位core dump的文件行.

5. 給個例子

test.c

?

void a()

{

?? char *p = NULL;

?? printf("%d/n", *p);

}

?

int main()

{

??? a();

??? return 0;

}

?

編譯 gcc -g -o test test.c

運行 ./test

報segmentation fault(core dump)

gdb ./test test.core如果生成的是test.core.

?

?

總結

以上是生活随笔為你收集整理的学会用core dump调试程序错误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。