• 创建线程 出现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后解决。

    深圳宝安华美居
  • 相关阅读:
    Thumbnailator压缩图片
    dubbo序列化的一点注意
    Java编程思想读书笔记之内部类
    Hello World
    sql中where和having的区别
    Linux下服务器搭建
    maven中profile的激活方式
    <![CDATA[ ]]>
    linux下用xampp安装php集成环境,并修改各自端口号
    关于星号(**/*.java)
  • 原文地址:https://www.cnblogs.com/tid-think/p/14447212.html
Copyright © 2020-2023  润新知