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