同樣的程序,已收到兩份異常報告,還在定位問題;
1.第一種情況:PC指向靜態庫中函數的一個地址
[E][01-01 00:00:21808][sc2000_app][ac_sigsegv_handler :81] Signal = 11? Memory location = (nil)
R0 = 0000000000000000? R1 = 000000005E801070? R2 = 0000000000000001
R3 = 0000000000000000? R4 = 000000005E801208? R5 = 000000005E801070
R6 = 000000005E801070? R7 = 000000005D7FDC30
R8 = 000000005E801070? R9 = 000000005E801070? R10 = 0000000000000040
FP = 0000000000000000? IP = 00000000004A1594? SP = 000000005D7FDBA8
LR = 00000000003A95E5? PC = 00000000003A828A
// evbuffer_expand_singlechain???? evbuffer_chain_insert
[E][01-01 00:00:21809][sc2000_app][ac_sigsegv_handler :86] backtrace() returned 2 addresses
[E][01-01 00:00:21810][sc2000_app][ac_sigsegv_handler :100] 0: /mnt/mtd/sc2000_app() [0x15da06]
[E][01-01 00:00:21810][sc2000_app][ac_sigsegv_handler :100] 1: /lib/libc.so.6(+0x25030) [0x76c40030]
[E][01-01 00:00:21810][sc2000_app][ac_sigsegv_handler :106] Program exits
root@xag:/tmp/pokyLog# cat /mnt/mtd/SIGSEGV.txt
sig : Memory location : lr : pc --> 11:0:3839461:3834506
/mnt/mtd/sc2000_app() [0x15da06]
/lib/libc.so.6(+0x25030) [0x76c40030]
2.第二種情況:PC指向一個堆棧地址
[E][05-14 09:10:18613][sc2000_app][ac_sigsegv_handler :206] backtrace() returned 2 addresses
[E][05-14 09:10:18614][sc2000_app][ac_sigsegv_handler :217] 0: /mnt/mtd/sc2000_app() [0x15f880]
[E][05-14 09:10:18615][sc2000_app][ac_sigsegv_handler :217] 1: /lib/libc.so.6(+0x25030) [0x76c40030]
[E][05-14 09:10:18615][sc2000_app][ac_sigsegv_handler :201] Signal = 11? Memory location = 0x5e800a50
R0 = 0000000000001041? R1 = 0000000000000070? R2 = 0000000000000070
R3 = 0000000000001041? R4 = 0000000000000000? R5 = 00000000FFFFFFEC
R6 = 0000000076C694DB? R7 = 0000000000000019
R8 = 0000000000000000? R9 = 000000005EB0DB80? R10 = 0000000000000000
FP = 00000000FFFFFFEC? IP = 0000000000000021? SP = 000000005EB0DB20
LR = 000000000010327B? PC = 000000005E800A50
segment fault 常見觸發源
內核會依據下列條件來判斷是否發生了用戶態段錯誤,并上報SIGSEGV信息給用戶態task:
??? 用戶態數據段的地址越界
??? 用戶態代碼段的指令讀取異常
??? 訪問操作與所訪問的內存頁面權限不匹配
??? 非對齊訪問
導致段錯誤的常見編程范式有:
??? 使用未初始化變量
??? 使用已釋放的內存
??? 數組越界
??? 多進程下使用不可重入函數
??? 內存溢出