为什么在使用Android native Thread时报错Fatal signal 11 (SIGSEGV)?

sugelawa 2014-04-18 06:17:33
我仿效Android的代码写了这样一个非常简单的Android C++ Thread类使用的测试程序:先构建一个WorkerInterface基类,然后派生了一个Worker类,他们有一个loopOnce方法。另外从Thread派生了一个WorkerThread类,用来实现多线程,WorkerThread有一个sp<WorkerInterface> mWorker的成员变量,它在WorkerThread构造函数中初始化 mWorker = new Worker()。在WorkerThread的threadLoop方法中调用成员变量mWorker的loopOnce方法,但在这个地方报错Fatal signal 11 (SIGSEGV)。整了几点怎么试都不能解决,有大侠能帮忙诊断下吗,我将无比感激。


#include <jni.h>
#include <cutils/log.h>
#include <utils/threads.h>
#include <utils/RefBase.h>

namespace android {


//------------------------------------------------
class WorkerInterface : public virtual RefBase {
protected:
WorkerInterface() { }
virtual ~WorkerInterface() { }

public:
virtual void loopOnce() = 0;
};
//------------------------------------------------


//------------------------------------------------
// Worker class which will do the job in the Thread
class Worker : public WorkerInterface {
public:
Worker();
virtual ~Worker();

virtual void loopOnce();
};


// Implement of the Worker class
Worker::Worker() {
}

Worker::~Worker() {
}

void Worker::loopOnce() {
ALOGE("+++++++++++++++++++++++++++++Worker::loopOnce");
}
//------------------------------------------------

//------------------------------------------------
// Worker thread class which construct the thread
class WorkerThread: public Thread {
public:
WorkerThread();
virtual bool threadLoop();
private:
sp<WorkerInterface> mWorker;
};


// Implement of the WorkerThread class
WorkerThread::WorkerThread() : Thread(false) {
mWorker = new Worker();
}

bool WorkerThread::threadLoop() {
ALOGD("------------------threadLoop");
// *******************======>下面就是罪恶的报错的地方: Fatal signal 11 (SIGSEGV)
mWorker->loopOnce();
return true;
}
//------------------------------------------------

//------------------------------------------------
JNIEXPORT jint JNICALL Java_me_autotouch_autotouch_Kernel_nativeReadyToRecord(JNIEnv *env, jobject obj) {

sp<WorkerThread> thread = new WorkerThread();
thread->run("WorkerThread", PRIORITY_URGENT_DISPLAY);
while(1);
ALOGD("jni calling end");

return 0;
}

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
return JNI_VERSION_1_4;
}
//------------------------------------------------
...全文
158 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouhaijun029 2015-04-20
  • 打赏
  • 举报
回复
从 utils 里抽出 Threads.cpp,加上打印追踪却没有重现这个问题。估计极端情况下,一些语句的汇编优化,特别是if语句优化,会导致判断卡槽slot提前,而初始化在后,造成指针访问没复制吧。重新编译,或插入无关语句,重新打乱了指令序列。
sugelawa 2014-04-24
  • 打赏
  • 举报
回复
顶上去顶上去顶上去

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧