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

创建线程 出现SIGSEGV crash的更多相关文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  2. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  3. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  4. python:threading多线程模块-创建线程

    创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...

  5. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  6. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  7. 驱动开发之 创建线程函数PsCreateSystemThread

    PsCreateSystemThread 创建一个执行在内核模式的系统线程. 注意:创建线程必须用函数PsTerminateSystemThread强制线程结束.否则该线程是无法自动退出的. 函数原型 ...

  8. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  9. 创建线程方式-NSThread

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. 离散化模板题 I ——重复元素离散化后的数字相同

    离散化模板题 I --重复元素离散化后的数字相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字相同.  输入 第一行,一 ...

  2. c++ undefined reference

    记录一次c++编程时发现的问题 报错 undefined reference undefined reference to `Student::~Student()' 下面还有类似的好几行,翻译过来就 ...

  3. 学习PHP中统计扩展函数的使用

    做统计相关系统的朋友一定都会学习过什么正态分布.方差.标准差之类的概念,在 PHP 中,也有相应的扩展函数是专门为这些统计相关的功能所开发的.我们今天要学习的 stats 扩展函数库就是这类操作函数. ...

  4. PHP密码散列算法的学习

    不知道大家有没有看过 Laravel 的源码.在 Laravel 源码中,对于用户密码的加密,使用的是 password_hash() 这个函数.这个函数是属于 PHP 密码散列算法扩展中所包含的函数 ...

  5. google插件网页播放mp4代码

    <script src="http://html5media.googlecode.com/svn/trunk/src/html5media.min.js"></ ...

  6. 配置 放上传文件的目录 apache(httpd)

    1. 确认服务器 开放8088端口 https://www.apachefriends.org/download.html 下载XAMPP for Windows,安装 2. 修改apache主配置文 ...

  7. python学习笔记(九)-函数2

    交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...

  8. requestAnimationFrame 切换页面问题

    requestAnimationFrame 切换页面时, 之前定时的内容还会继续执行. 所以 要注意处理动画函数内容,否则会出现死循环. 遇到的问题: 我在两个页面都有使用 requestAnimat ...

  9. 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 百篇博客分析OpenHarmony源码 | v14.14

    百篇博客系列篇.本篇为: v14.xx 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...

  10. Phalcon如何切换数据库《Phalcon入坑指南系列 三》

    本系列目录 一.Phalcon在Windows上安装 <Phalcon入坑指南系列 一> 二.Phalcon入坑必须知道的功能(项目配置.控制器.模型.增.删.改.查) 三.Phalcon ...