创建线程 出现SIGSEGV crash

在Opwrt平台上测试ok的一个网络传输延时测试demo程序移植到Android平台后,运行出现莫名其妙的SIGSEGV crash。

仔细检查过源码,特别是指针等后未发现问题。

--------- beginning of crash
F/libc    ( 1173): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb6d72c24 in tid 1174 (tcp_cli)
I/DEBUG   (   62): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   62): Build fingerprint: 'BUILD_FINGERPRINT'
I/DEBUG   (   62): Revision: '0'
I/DEBUG   (   62): ABI: 'arm'
I/DEBUG   (   62): pid: 1173, tid: 1174, name: tcp_cli  >>> ./tcp_cli <<<
I/DEBUG   (   62): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb6d72c24
I/DEBUG   (   62):     r0 b6d82d3c  r1 00000000  r2 00100000  r3 91902916
I/DEBUG   (   62):     r4 b6f1fdd4  r5 b6f41a6c  r6 00000003  r7 b6d82d3c
I/DEBUG   (   62):     r8 b8e590e8  r9 b8e590e8  sl b6eda581  fp b6e82dd0
I/DEBUG   (   62):     ip b6f43f7c  sp b6d72c28  lr b6f40e45  pc b6ed6c00  cpsr 40070010
I/DEBUG   (   62): 
I/DEBUG   (   62): backtrace:
I/DEBUG   (   62):     #00 pc 00012c00  /system/lib/libc.so (memset)
I/DEBUG   (   62):     #01 pc 00000e41  /dev/tcp_cli
I/DEBUG   (   62):     #02 pc 000011e1  /dev/tcp_cli
I/DEBUG   (   62):     #03 pc 0001659f  /system/lib/libc.so (__pthread_start(void*)+30)
I/DEBUG   (   62):     #04 pc 000144cb  /system/lib/libc.so (__start_thread+6)
W/libbacktrace(   62): virtual bool BacktracePtrace::ReadWord(uintptr_t, word_t*): invalid pointer 0xb6d72be8 reading from tid 1174, ptrace() strerror(errno)=I/O error
W/libbacktrace(   62): virtual bool BacktracePtrace::ReadWord(uintptr_t, word_t*): invalid pointer 0xb6d72c28 reading from tid 1174, ptrace() strerror(errno)=I/O error
W/libbacktrace(   62): virtual bool BacktracePtrace::ReadWord(uintptr_t, word_t*): invalid pointer 0xb6d72c28 reading from tid 1174, ptrace() strerror(errno)=I/O error

从log上看是在创建线程后,线程启动,系统调用memset出现了错误,而不是用户调用memset导致。

使用addr2line工具查看对应的bin文件找到出错地址e41对应的源码所在如下:

 ./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-addr2line -e  out/target/product/rk3036/symbols/system/bin/tcp_cli e41
/home/liuxueneng/workCode/rk3036_dongle/external/lollipop_wifi/net/tcp_cli.c:71

找到对应源文件指定行71

  68                                                                               
  69 static int do_recv_handle(int sockfd)                                         
  70 {                                                                             
  71     char buf[BUFSIZE] = {0};                                                  
  72     int numbytes = 0;                                                         
  73     struct timeval timeout, recvtv, tv;    
  
  36                                                                               
  37 #define BUFSIZE             (1 << 20)                                         
  38 

很明显此处申请了一个1M的buf,但是受限于线程栈大小,所以每次运行到此处出现SIGSEGV错误而crash。

修改成128K后解决。

深圳宝安华美居
原文地址:https://www.cnblogs.com/tid-think/p/14447212.html