同样的程序,已收到两份异常报告,还在定位问题;
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:
用户态数据段的地址越界
用户态代码段的指令读取异常
访问操作与所访问的内存页面权限不匹配
非对齐访问
导致段错误的常见编程范式有:
使用未初始化变量
使用已释放的内存
数组越界
多进程下使用不可重入函数
内存溢出