沒有core dump文件如何定位問題

最近在 Linux Qt上做開發,發現程序異常crash,用core dump文件也沒有記錄下來有用的信息,如下圖:


定位程序異常crash 的過程百般痛苦,雖然最後是用 把core dump文件大小的限制取消,完整記錄程序崩潰的堆棧信息結合gdb 定位到問題,但發現網友分享的 不用core -dump 定位bug的方法,故記錄下來,以備他日試用。


有時寫c/c++程序,運行後出現core, 如果有core文件則可以gdb方便的定位問題,

可是,當core文件找不到(或被刪除)時如何定位?

剛做了個測試,在沒有core文件的情況下對程序bug進行定位


cat core.cpp 
1 #include <iostream>

  2 
  3 int main(int argc, char** argv){
  4 
  5         int *p = NULL;
  6         for(int i=0; i<15; i++){
  7                 p[i] = i;
  8         }
  9 
 10         return 0;
 11 }

g++ -g core.cpp -o core

./core

Segmentation fault





/var/log]# vim messages

Nov 24 04:02:08 i237 syslogd 1.4.1: restart.
Nov 25 13:55:01 i237 kernel: testreg[19978]: segfault at 000000000000000a rip 00000036ed078d50 rsp 00007fffa7125888 error 4
Nov 25 13:58:20 i237 kernel: testreg[20711]: segfault at 00000000000003e8 rip 00000036ed078d70 rsp 00007fff8e28ac98 error 4
Nov 25 16:19:10 i237 kernel: core[17962]: segfault at 0000000000000000 rip 0000000000400677 rsp 00007fff0c53dc30 error 6


最後一個core[17962]即是剛纔生成core的進程

可以到這個core.cpp生成core的目錄下

執行: 

addr2line 0000000000400677 -e /path/./core

輸出:
....../core.cpp:7

這樣我們可以初步定位到位core.cpp第7行的問題,回到程序中看是非法地址的賦值


我們看下man addr2line

NAME
       addr2line - convert addresses into file names and line numbers.

這個命令本身就是把地址轉成名稱和行號的,只是我們對於這個地址需要在message日誌中看rip地址才能得到


另外,error 後的數字轉換到二進制依次對應描述如下:

bit2: 值爲1表示是用戶態程序內存訪問越界,值爲0表示是內核態程序內存訪問越界
bit1: 值爲1表示是寫操作導致內存訪問越界,值爲0表示是讀操作導致內存訪問越界
bit0: 值爲1表示沒有足夠的權限訪問非法地址的內容,值爲0表示訪問的非法地址根本沒有對應的頁面,也就是無效地址

所以從這個error 6也可以知道原因是 用戶程序操作訪問越界



最後百科裏借用一個寄存器:

專用寄存器

專用寄存器包括: RIP、RSP和RFLAGS以及段寄存器CS、DS、ES、SS、FS和GS。

RIP(指令指針)RIP尋址代碼段存儲區內的下一條指令。當微處理器工作在實模式下時,這個寄存器是IP(16位);當80386及更高型號的微處理器工作於保護模式下時,則是EIP(32位)。注意,8086、8088和80286不包含EIP寄存器,而且只有80286及更高型號的微處理器可以工作於保護模式。指令指針指向程序的下一條指令,用於微處理器在程序中順序地尋址代碼段內的下一條指令。指令指針也可由轉移指令或調用指令修改。在64位模式中,RIP包含40位地址總線,可用於尋址1TB平展模式地址空間。

RSP(堆棧指針)RSP尋址一個稱爲堆棧的存儲區。通過這個指針存取堆棧存儲器數據,具體操作將在本書後面講解訪問堆棧存儲器數據的指令時再進行說明。這個寄存器作爲16位寄存器被引用時,爲SP;如果作爲32位寄存器,則是ESP。




原文地址:http://blog.csdn.net/cloudusers/article/details/16946285


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章