在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后解决。