NDK中使用pthread多线程中自己写的一个BUG
在使用pthread进行NDK中的多线程开发时,自己写了一个BUG,
- void *darkGrayThread(void *args)
- {
- ThreadParam *param = (ThreadParam *)args;
- LOG("start%d end%d ", param->start, param->end);
- int end = param->end;
- for(int i = param->start, j = i * ; i < end; ++i, j+=)
- {
- LOG("d1");
- param->r[i] = param->rgba[j];
- param->g[i] = param->rgba[j + ];
- param->b[i] = param->rgba[j + ];
- LOG("d2 %d end%d", i, param->end);
- param->dark[i] = MINT(param->rgba[j], param->rgba[j + ], param->rgba[j + ]);
- param->gray[i] = (UCHAR)((param->rgba[j] * + param->rgba[j + ] * +param->rgba[j + ] * ) >> );
- LOG("d3");
- }
- }
这个是启动函数,即相当于Java中的Thread的run方法。初一看没啥问题,编译也能过,APP也能跑,但是每次都会crash。我把crash线程的log贴出来如下:
- - ::31.577 D MyJni : d2 end2073600
- - ::31.637 D MyJni : d3
- - ::31.641 D MyJni : d3
- - ::31.641 D MyJni : d1
- - ::31.641 D MyJni : d2 end2073600
- - ::31.642 D MyJni : d3
- - ::31.642 D MyJni : d1
- - ::31.642 D MyJni : d1
- - ::31.642 D MyJni : d2 end2073600
- - ::31.642 D MyJni : d3
- - ::31.642 D MyJni : d3
- - ::31.785 D MyJni : d2 end2073600
- - ::31.785 D MyJni : d3
- - ::31.785 D MyJni : d1
- - ::31.786 D MyJni : d1
- - ::31.786 D MyJni : d2 end2073600
- - ::31.786 D MyJni : d2 end2073600
- - ::31.786 D MyJni : d3
- - ::31.786 D MyJni : d2 end2073600
- - ::32.339 F libc : Fatal signal (SIGSEGV), code , fault addr 0xc6800000 in tid (Thread-)
- - ::32.339 F libc : Fatal signal (SIGSEGV), code , fault addr 0xc6800000 in tid (Thread-)
- - ::32.340 W : debuggerd: handling request: pid= uid= gid= tid=
- - ::32.381 F DEBUG : pid: , tid: , name: Thread- >>> com.willhua.opencvstudy <<<
- - ::32.381 F DEBUG : signal (SIGSEGV), code (SEGV_MAPERR), fault addr 0xc6800000
- - ::32.381 F DEBUG : r0 000000a7 r1 c6600000 r2 cac6ef0e r3 000000be
- - ::32.381 F DEBUG : r4 caa4ca9c r5 r6 r7 c62038f8
- - ::32.381 F DEBUG : r8 r9 000001d3 sl cac6ef0e fp cac6ebe0
- - ::32.381 F DEBUG : ip c7680000 sp c62038e8 lr caa8e93f pc caa8e99a cpsr 200f0030
- - ::32.383 F DEBUG :
- - ::32.383 F DEBUG : backtrace:
- - ::32.383 F DEBUG : # pc 0004099a /data/app/com.willhua.opencvstudy-/lib/arm/libOpenCV.so (_Z14darkGrayThreadPv+)
- - ::32.383 F DEBUG : # pc 000475d3 /system/lib/libc.so (_ZL15__pthread_startPv+)
- - ::32.383 F DEBUG : # pc 00019d3d /system/lib/libc.so (__start_thread+)
从log中看出,是内存访问错误,然后使用addr2line工具定位到是上述代码中的第13行。
再仔细一点可以看到,log中打印的end都比前面的数字小!!!上面不是有for循环的条件语句吗?怎么会出现这种情况!?其中的MINT只是我使用define定义的求三个数中的最小数的宏。
为了确定问题,我把13写成了
- UCHAR uu = MINT(param->rgba[j], param->rgba[j + ], param->rgba[j + ]);
- param->dark[i] = uu;
然后根据log分析,还是param->dark[i] = uu; 这行报错。然后我又跑去前面的代码确定给dark分配的内存没有问题。还是没找到原因。
后面突然发现,写的darkGrayThread没有写返回值!于是赶紧再后面添加一句return (void *)0; 再测试,发现没问题,原因就是这个了。
为了知道原因,我在没有写return的版本的最后添加LOG("endend"); 发现每次都会有数量不等的endend日志打印出来。这说明for的条件语句还是有退出循环的作用的。
要想继续分析,可能需要对比有没有return的两个版本的汇编代码,来比较一下有没有return他们翻译成汇编的区别,待后续分析。
这个问题的收获就是:写启动程序一定记得有return语句,即使你的return值没有用!
NDK中使用pthread多线程中自己写的一个BUG的更多相关文章
- 写了一个bug,最后却变成了feature,要不要修呢?
事情是这样子的,前不久接到一个需求,为一个游戏开发礼包码功能 通常一款游戏运营期间会搞各种各样的活动吸引玩家,其中最常见的就是发放礼包, 玩家可以通过礼包码兑换礼包. 用礼包码兑换礼包有个一限制,游 ...
- winform中如何在多线程中更新UI控件--ListView实时显示执行信息
1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...
- WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】
第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体 在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体 ...
- SLua 中继承 C# 类接口 Slua.Class 的一个 Bug。
由于目前要把大量的代码移植到 lua 中(真是够虐心的),面向对象肯定少不了,项目的代码都是这么设计的,于是就测试 Slua.Class 接口来扩展 C# 的类,发现有点问题,给作者提交了一个 Iss ...
- 终于,帮开发写了一个bug
写在文章的开头 最近项目比较紧,尤其前端的的需求比较多,作为一名测试,也会些vue,本着加快项目进度的美好想法,就自告奋勇的向组长承接了一部分开发的任务,其中有个需求需要在我们的广告管理后台新增一个上 ...
- WinForm中 事件 委托 多线程的应用
WinForm中 事件 委托 多线程的应用[以一个下载进度条为例] 第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就 ...
- 多线程中的lua同步问题
最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定.经过简单分析之后,确定是线 ...
- <转>多线程中的lua同步问题
转自 http://www.cnblogs.com/ghost240/p/3526185.html 最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运 ...
- Java多线程中的死锁问题
Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...
随机推荐
- psnr的定义和python实现
psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限性,一般是用于最大值信号和背景噪音之间的一个工程项目. peak的中文意思是 ...
- Kubernetes系列之Coredns and Dashboard介绍篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 项目地址:https://github.com/coredns/coredns Core ...
- Excel 逻辑函数if使用方法
Excel 逻辑函数if使用方法
- 关于git 指令
命令行操作(由于是Linux命令行下的普通用户,都是在$级别下操作): 一. 本机配置 添加用户 git config –global user.name “XX” git config –gloab ...
- centos7系统配置记录SFTP操作日志
1.修改ssh配置 [root@elk-node2 ~]# vim /etc/ssh/sshd_config 大概132行把下面这个句注释掉 #Subsystem sftp /usr ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- 让Python代码更快运行的 5 种方法
不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和 ...
- spring boot(三) 集成mybatis
前言 还记得之前我们写接口也是基于SpringMVC+MyBatis环境下,项目入手就需要N个配置文件,N个步骤才能实现,不但繁琐,而且时间长了xml配置文件太多,难以维护.现在基于spring bo ...
- SQL Server 怎么在分页获取数据的同时获取到总记录数
SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...