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中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...
随机推荐
- 机器学习入门08 - 表示法 (Representation)
原文链接:https://developers.google.com/machine-learning/crash-course/representation/ 机器学习模型不能直接看到.听到或感知输 ...
- Ubuntu 18.04基础软件安装
1.fcitx 这个应该是最基础的了,虽然系统自带的也有,不过说实话可能是我还不会配置,我觉得是不好用,坚持用了一周后还是换回了小企鹅,最初是装小企鹅时失败了被迫坚持用了一周,当时失败情况是这样的,使 ...
- Group By Grouping Sets
Group by分组函数的自定义,与group by配合使用可更加灵活的对结果集进行分组,Grouping sets会对各个层级进行汇总,然后将各个层级的汇总值union all在一起,但却比单纯的g ...
- [原创]K8Cscan插件之FTP弱口令扫描
[原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...
- 好玩的原生js的简单拖拽
这个拖拽的图片不是唯一的,拿到代码自己添加一张照片就可以啦 <!DOCTYPE html><html> <head> <meta charset=" ...
- 关于sql和MySQL的语句执行顺序(必看!!!)
今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...
- springBoot(1)---springboot初步理解
springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...
- Android--UI之Gallery
前言 这篇博客讲解一下Android开发中,Gallery控件的使用,这是一个画廊视图,用于展示一组图片,用固定在中间位置的水平滚动列表显示列表项的视图.Android最新的API文档中了解到,在An ...
- [Jenkins]JDK版本过高导致的java.io.IOException: Remote call on xxxx failed
------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...
- 剑指offer-学习笔记
前言:18/06/06开始学习,每个程序都会用C写一遍,因书中用C++举例,也会换种思路写,供学习和参考!!!很推荐这本书很不错,准备入手,一般不买实体书,都用电子书,因一般都看一遍,但这本会看很多遍 ...