微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 致命信号11(SIGSEGV)

我有一个奇怪的错误,我无法找到它来自哪里. 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)

然后我尝试在每个监听器的更新方法的第一行打印一个日志,但是没有打印出来(我觉得这很奇怪).

任何帮助将不胜感激

最佳答案
大多数时候当您尝试访问当时未创建的任何对象时,会发生致命信号错误.所以要正确检查它们.

原文地址:https://www.jb51.cc/android/430767.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐