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中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...
随机推荐
- 远程桌面连接:出现身份验证错误,要求的函数不受支持,可能是由于CredSSP加密Oracle修正的解决方法
在做app时需要连接服务器来进行数据交互,但是在阿里云页面里连接服务器太不好用,所以使用windows自带的远程连接来进行. 一.但是连接的过程中出现了以下问题: 二.最初是有点迷茫的,不知道从哪里下 ...
- C语言中assert()断言函数的概念及用法
断言函数的格式如下所示: void assert (int expression);如果参数expression等于零,一个错误消息将会写入到设备的标准错误集并且会调用abort函数,就会结束程序的执 ...
- Nuxt 2 即将来临
原文出处:
- rest-framework之APIView 序列化组件
rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...
- mysql 开发基础系列4 字符数据类型
字符串类型 1.1 CHAR 和VARCHAR 类型 CHAR 列的长度固定为创建表时声明的长度,VARCHAR 列中的值为可变长字符串.在检索的时候,CHAR 列删除了尾部的空格,而VARCHAR ...
- 【杂谈】Tomcat 之 Lifecycle接口
前言 此篇随笔记录<How Tomcat works>中关于Lifecycle接口的相关总结 Lifecycle接口的主要目的 核心:统一. 已知Tomcat的卡特琳娜(Catalina) ...
- 想入职阿里的Java开发者必看,阿里巴巴面试官实战经验分享!
最近社区Java技术进阶群的小伙伴总是会问,如何面试阿里Java技术岗,需要什么条件,做哪些准备:小编就这些问题找到了阿里技术团队中在一线真正带Java开发团队并直接参与技术面试的专家,分享了自身在筛 ...
- JavaScript基础——深入学习async/await
本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...
- Linux常用命令之网络和关机重启命令
目录 1.网络命令 一.给指定用户发送信息:write 二.给所有用户发送广播信息:wall 三.测试网络连通性:ping 四.查看和设置网卡信息:ifconfig 五.查看发送电子邮件:mail 六 ...
- Jenkins构建部署Maven项目
1 创建新项目 2 构建maven项目 3 配置 3.1 源代码管理 svn 用户名,密码 4 配置maven打包 配置SSH 保存之后 立即构建 执行成功