addr2line探秘(没有core怎么办)
轉(zhuǎn)自:http://www.cnblogs.com/li-hao/archive/2013/04/03/2997807.html
在Linux下寫C/C++程序的程序員,時常與Core Dump相見。在內(nèi)存越界訪問,收到不能處理的信號,除零等錯誤出現(xiàn)時,我們精心或不精心寫就的程序就直接一命嗚呼了,Core Dump是Linux仁慈地留下的程序的尸體,幫助程序員們解決了一個又一個問題。
有時配置不給力,Linux直接毀尸滅跡,沒有了Core文件;又有時,剛好磁盤空間不足,Core文件寫不下了。沒有Core文件的時候,如何知道程序在什么地方出錯了呢?addr2line就在這時派上用場。
這是一個示例程序,func函數(shù)返回參數(shù)a除以參數(shù)b的結(jié)果。這里使用0作為除數(shù),結(jié)果就是程序因為除以0導致錯誤,直接中斷了。
?
使用
$ gcc -o test1 -g test1.c編譯程序,test1.c是程序文件名。執(zhí)行程序,結(jié)果程序異常中斷。查看系統(tǒng)dmesg信息,發(fā)現(xiàn)系統(tǒng)日志的錯誤信息:
[54106.016179] test1[8352] trap divide error ip:400506 sp:7fff2add87e0 error:0 in test1[400000+1000]這條信息里的ip字段后面的數(shù)字就是test1程序出錯時所程序執(zhí)行的位置。使用addr2line就可以將400506轉(zhuǎn)換成出錯程序的位置:
$ addr2line -e test1 400506 /home/hanfoo/code/test/addr2line/test1.c:5這里的test1.c:5指的就是test1.c的第5行
也正是這里出現(xiàn)的錯誤。addr2line幫助我們解決了問題。
?
addr2line如何找到的這一行呢。在可執(zhí)行程序中都包含有調(diào)試信息,其中很重要的一份數(shù)據(jù)就是程序源程序的行號和編譯后的機器代碼之間的對應關系Line Number Table。DWARF格式的Line Number Table是一種高度壓縮的數(shù)據(jù),存儲的是表格前后兩行的差值,在解析調(diào)試信息時,需要按照規(guī)則在內(nèi)存里重建Line Number Table才能使用。
Line Number Table存儲在可執(zhí)行程序的.debug_line域,使用命令
$ readelf -w test1可以輸出DWARF的調(diào)試信息,其中有兩行
這里說明機器二進制編碼的0x4004fe位置開始,對應于源碼中的第5行,0x400509開始就對應與源碼的第6行了,所以400506這個地址對應的是源碼第5行位置。
?
addr2line通過分析調(diào)試信息中的Line Number Table自動就能把源碼中的出錯位置找出來,再也不怕Linux毀尸滅跡了。
總結(jié)
以上是生活随笔為你收集整理的addr2line探秘(没有core怎么办)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下产生core文件以及不产生c
- 下一篇: 学会用core dump调试程序错误