Linux下使用backtrace捕獲宕機堆疊資訊

2021-10-21 23:44:02 字數 2364 閱讀 9515

linux下常見的宕機訊號,如下:

訊號名編號值

描述系統預設處理方式

sigint

2正常終止程序(ctrl + c)

終止程序

sigquit

3異常終止程序

終止程序,並允許產生core檔案

sigabrt

6異常終止程序

終止程序,並允許產生core檔案

sigbus

7異常終止程序,硬體錯誤

終止程序,並允許產生core檔案

sigfpe

8錯誤的算術運算,比如除數為0

終止程序

sigkill

9異常終止程序,非法指令

終止程序

sigse**

11異常終止程序,訪問無效的位址

終止程序,並允許產生core檔案

sigpipe

13向沒有讀許可權的管道檔案寫操作

終止程序

sigterm

15kill pid時預設傳送的訊號

終止程序

sigstkflt

16linux專用,數學協處理器的棧異常

終止程序

static

void

print_maps

(void);

char buff[

512]=;

pid =

getpid()

;snprintf

(cmd,

sizeof

(cmd)

,"cat /proc/%d/maps"

, pid)

; fp =

popen((

const

char

*)cmd,

"r");if

(fp !=

null)}

pclose

(fp);}

static

void

systemerrorhandler

(int signum)

intcatch_sigse**_info

(void

)

其中print_maps列印的是程序執行時動態載入的maps對映,因為動態庫在執行的時候才分配位址空間,每次執行時的位址範圍都不一樣。用backtrace列印出來的宕機位址偏移,並不能直接用addr2line命令定址找到位置,會提示??:?

必須通過maps的範圍,找到正確的位址偏移,才能用addr2line正確定位到宕機位置。

例如:

b6b58000-b6c99000 r-xp 00000000 b3:03 18443 /system/lib/libtest.so

b6c99000-b6ca8000 —p 00141000 b3:03 18443 /system/lib/libtest.so

b6ca8000-b6cc8000 rw-p 00140000 b3:03 18443 /system/lib/libtest.so

若宕機位址是libtest.so(0xb6b59000), 那麼用0xb6b59000 - 0xb6b58000 = 0x1000,然後用addr2liine -c -e libtest.so 0x1000 則可得到正確的宕機位置

編譯的時候需要加上引數:-g -rdynamic

嵌入式系統還需要加上引數: -funwind-tables -ffunction-sections

字串陣列

使用signal.h標頭檔案下的字串陣列sys_siglist,將訊號作為下標時,字串就是對應的訊號含義:

#include

extern const char * const sys_siglist;

psignal函式

定義如下:

#include

void psignal (int signo, const char *msg);

這個函式的使用同perror類似,例如,呼叫:

psignal(13, 「signal」);

將會顯示「signal: broken pipe」

strsignal函式

與perror和strerror兩個函式類似,有psignal,其實也有strsignal函式,定義如下:

#include

char * strsignal (int signo);

效果和strerror類似。需要注意這個函式返回的字串指標僅在下一次呼叫strsignal前保持不變,所以這個函式不是執行緒安全的。

no pains, no gains.

linux下串列埠使用

串列埠終端程式設計順序 開啟 設定 讀寫 關閉。涉及到的api。1 獲取終端屬性tcgetattr 原型 int tcgetattr int fd,struct termios termios p 功能 取得終端介質 fd 初始值,並把其值賦給temios p 函式可以從後台程序中呼叫 但是,終端屬...

linux 下vi 的使用

進入vi的命令 vi filename 開啟或新建檔案,並將游標置於第一行首 vi n filename 開啟檔案,並將游標置於第n行首 vi filename 開啟檔案,並將游標置於最後一行首 vi pattern filename 開啟檔案,並將游標置於第乙個與pattern匹配的串處 vi r...

Linux下使用Ntfs分割槽

在使用windows作業系統時,ntfs做為最常用的分割槽格式存在,但是因為這個格式在linux下預設不能直接使用,所以linux使用者不能充分利用ntfs格式的硬碟空間,因為linux沒有將掛載ntfs格式這項功能編譯到核心裡面,所以使用者必須重新編譯核心 但是編譯過程比較複雜又很難保證一定能夠掛...