我有一个奇怪的错误,我无法找到它来自哪里. logcat中唯一出现的是:
01-10 17:07:10.665:A / libc(20449):0x00000000处的致命信号11(SIGSEGV)(代码= 1)
当我运行我的应用程序时,我不会立即收到此错误,我会在一段随机时间(1分钟到5分钟之间)之后得到它.我无法重现这个错误,它似乎是随机的,因为没有其他信息,所以很难调试.我试图在我的库中添加一些日志信息,但我仍然不能说崩溃发生在哪里.
我运行相同的应用程序x次,我得到不同的SIGSEGV地址(有时它是与以前相同的地址:
01-10 17:29:04.650:A / libc(21588):致命信号11(SIGSEGV)位于0x6c707063(代码= 1)
01-10 17:25:55.165:A / libc(21473):致命信号11(SIGSEGV)位于0x0069004c(代码= 1)
01-10 17:11:58.780:A / libc(20742):0x00000000处的致命信号11(SIGSEGV)(代码= 1)
01-10 17:00:02.010:A / libc(20160):致命信号11(SIGSEGV)位于0x00000018(代码= 1)
我的应用程序使用的c库具有从服务器接收更新的NetworkThread.在Java端有一个WorkerThread,检查是否有来自NetworkThread的新更新,如果有新的更新,它通知所有的监听器.我还有一个LocationSpotter(在Java端),在更新位置时进行一些JNI调用.
有没有办法调试这个或使用我从SIGSEGV获得的地址来调试应用程序?此外,我正在使用共享JavaVM对象来获取某些方法来检索当前的JNIEnv(并调用AttachCurrentThread).这个线程安全吗?
我注意到在收到SIGSEGV错误之后(在应用程序实际崩溃之前)我仍然收到来自NetworkThread的更新.这意味着NetworkThread可能正在运行.
我还注意到一行可能是我的问题的根源(在notifyAll方法中)因为在SIGSEGV之前打印的最后一条消息是“notifyAll1”:
for (unsigned i = 0; i < listeners.size(); i++) {
try {
__android_log_print(ANDROID_LOG_INFO,"FROM C++","notifyAll1");
if (listeners.at(i) == NULL)
__android_log_print(ANDROID_LOG_INFO,"LISTENER NULL");
listeners.at(i)->update(u); // <- This line is a potential suspect
__android_log_print(ANDROID_LOG_INFO,"notifyAll2");
logcat:
01-10 17:07:10.665: I/FROM C++(20449): notifyAll1
01-10 17:07:10.665: A/libc(20449): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
然后我尝试在每个监听器的更新方法的第一行打印一个日志,但是没有打印出来(我觉得这很奇怪).
任何帮助将不胜感激