创建线程 出现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后解决。
创建线程 出现SIGSEGV crash的更多相关文章
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- python:threading多线程模块-创建线程
创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发编程:如何创建线程?
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- 驱动开发之 创建线程函数PsCreateSystemThread
PsCreateSystemThread 创建一个执行在内核模式的系统线程. 注意:创建线程必须用函数PsTerminateSystemThread强制线程结束.否则该线程是无法自动退出的. 函数原型 ...
- iOS开发多线程篇—创建线程
iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...
- 创建线程方式-NSThread
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- [Apache Atlas] Atlas 架构设计及源代码简单分析
Apache Atlas 架构图 Atlas 支持多数据源接入:Hive.HBase.Storm等 Type System Type Atlas 中定义了一些元数据类型 ── AtlasBaseTyp ...
- HCNP Routing&Switching之路由控制、路由策略和IP-Prefix List
前文我们了解了IS-IS路由聚合和认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15306645.html:今天我们来聊一聊路由控制技术中的路由策 ...
- TP5模型开启事务
和Db开启事务类似,Db是静态方法 $userObj = new UserModel(); $userObj->startTrans(); try { $userObj->data($da ...
- swiper轮播高度不正常
第一次进入页面可能是网速原因,图片加载问题等吧,导致轮播图高度很大,下面出现空白, 需要加入参数 autoHeight: true, observer: true, observeParents: t ...
- 【转】mysql实现随机获取几条数据的方法
sql语句有几种写法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要获取的数据条数: 2:SELECT *FROM `table` WHERE i ...
- Docker系列(24)- 实战:DockerFile制作tomcat镜像
实战:DockerFile制作tomcat镜像 step-1 准备镜像文件 tomcat压缩包,jdk压缩包! step-2 编写dockerfile文件,官方命名Dockerfile,build会自 ...
- redis 与java的连接 和集群环境下Session管理
redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ...
- 基于AM335X,如何搭建优良的Linux开发环境(下)
接着上一篇文章的Linux开发环境搭建,文章中详细讲解了 VMware14.1.1虚拟机安装.基于虚拟机安装Ubuntu14.04.3操作系统.安装Ubuntu14.04.3操作系统.安装虚拟机工具. ...
- CF618F-Double Knapsack【结论】
正题 题目链接:https://www.luogu.com.cn/problem/CF618F 题目大意 给出大小为\(n\),值域为\([1,n]\)的两个可重集合\(A,B\) 需要你对它们各求出 ...
- Django+Nginx+Uwsgi(全网最全步骤工作原理流程与部署历程)
一.必要前提 1.1 准备知识 django 一个基于python的开源web框架,请确保自己熟悉它的框架目录结构. uWSGI 一个基于自有的uwsgi协议.wsgi协议和http服务协议的web网 ...