android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!

时间:2021-06-29 00:13:34
RT,安卓在调用底层JNI的C代码的时候出现的问题,反复的调用久了就会出现这样的问题,但是我看C代码又看不出来什么问题,报了这样错误以后,用C写的代码还有打印信息,都不好定位错误在哪一行,参考这位高人的文章http://zzhhui.blog.sohu.com/266543920.html,其中有很多的困惑,请大家指点一点,平时都是怎么调试JNI的,要是能根据提示的地址XXXXX跟SO文件能定位到所出问题的函数或者代码行就好了,这位前辈的文章中有说到用addr2line 命令,我有试过用这个命令,再加上我的SO文件所在的目录,但是在NDK中执行了之后没有得到出错代码行的信息

22 个解决方案

#1


贴一下自己的在LogCat中的打印信息如下
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
奇怪的是程序已经报错了,下面还有C写的打印信息,难道不是出错了JNI中的C代码马上就停止运行了吗

#2


我在我的SO文件下NDK中执行addr2line -e libavplayer.so 61b5c482后得到的结果是??:0
是不是我这样的方式不对,我的SO文件是几个静态的a文件编译后产生的SO文件

#3


LOG中并没有看到挂掉的堆栈信息啊 一般像这种

04-15 11:06:53.859 F/libc    ( 2398): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

04-15 11:06:53.869 I/DEBUG   ( 1274): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

04-15 11:06:53.869 I/DEBUG   ( 1274): Build fingerprint: 'Xiaomi/mione_plus/mione_plus:4.0.4/IMM76D/ICS24.0:user/release-keys'

04-15 11:06:53.869 I/DEBUG   ( 1274): pid: 2398, tid: 2555  >>> org.linphone <<<

04-15 11:06:53.869 I/DEBUG   ( 1274): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r0 00fad7d0  r1 00000000  r2 000000a0  r3 00000050

04-15 11:06:53.869 I/DEBUG   ( 1274):  r4 00fbf180  r5 00000000  r6 5cfd59a0  r7 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r8 5cfd5820  r9 5cfd5814  10 5cfd58a0  fp 5cfd5818

04-15 11:06:53.869 I/DEBUG   ( 1274):  ip 00000001  sp 5cfd5804  lr 5c8546e4  pc 40050cc8  cpsr 80000010

04-15 11:06:53.869 I/DEBUG   ( 1274):  d0  0000000000000000  d1  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d2  0000000000000000  d3  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d4  0000000000000000  d5  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d6  0000000000000000  d7  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d8  400d9aa353e247de  d9  401c3fb69984a0e5

04-15 11:06:53.869 I/DEBUG   ( 1274):  d10 412e848000000000  d11 408f400000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d12 3feccccccccccccd  d13 4059000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d14 3fb9999999999998  d15 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d16 0000000000000000  d17 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d18 0000000000000000  d19 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d20 0000000000000000  d21 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d22 0000000000000000  d23 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d24 0000000000000000  d25 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d26 0000000000000000  d27 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d28 0000000000000000  d29 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d30 ffffffffffffffff  d31 ffffffffffffffff

04-15 11:06:53.869 I/DEBUG   ( 1274):  scr 60000012


里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

#4


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

04-15 11:06:53.859 F/libc    ( 2398): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

04-15 11:06:53.869 I/DEBUG   ( 1274): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

04-15 11:06:53.869 I/DEBUG   ( 1274): Build fingerprint: 'Xiaomi/mione_plus/mione_plus:4.0.4/IMM76D/ICS24.0:user/release-keys'

04-15 11:06:53.869 I/DEBUG   ( 1274): pid: 2398, tid: 2555  >>> org.linphone <<<

04-15 11:06:53.869 I/DEBUG   ( 1274): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r0 00fad7d0  r1 00000000  r2 000000a0  r3 00000050

04-15 11:06:53.869 I/DEBUG   ( 1274):  r4 00fbf180  r5 00000000  r6 5cfd59a0  r7 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r8 5cfd5820  r9 5cfd5814  10 5cfd58a0  fp 5cfd5818

04-15 11:06:53.869 I/DEBUG   ( 1274):  ip 00000001  sp 5cfd5804  lr 5c8546e4  pc 40050cc8  cpsr 80000010

04-15 11:06:53.869 I/DEBUG   ( 1274):  d0  0000000000000000  d1  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d2  0000000000000000  d3  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d4  0000000000000000  d5  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d6  0000000000000000  d7  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d8  400d9aa353e247de  d9  401c3fb69984a0e5

04-15 11:06:53.869 I/DEBUG   ( 1274):  d10 412e848000000000  d11 408f400000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d12 3feccccccccccccd  d13 4059000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d14 3fb9999999999998  d15 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d16 0000000000000000  d17 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d18 0000000000000000  d19 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d20 0000000000000000  d21 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d22 0000000000000000  d23 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d24 0000000000000000  d25 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d26 0000000000000000  d27 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d28 0000000000000000  d29 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d30 ffffffffffffffff  d31 ffffffffffffffff

04-15 11:06:53.869 I/DEBUG   ( 1274):  scr 60000012


里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

没有啊,我只看到了Fatal signal 11 (SIGSEGV) at XXXXX,没有看到像你切图那样的东西哦
这是我Eclipse中提示的打印信息,为什么我的没有像你切图里面Debug信息
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!

#5


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录


搜寻了一下,可以用Android ndk-stack tool
来查看产生这个错误的原因,但是出错的时候我的Eclipse中没有看到有*号开始的那些提示信息

我是用真机测试的,在工程目录下的jni文件夹下Application.mk中添加 APP_OPTIM := debug,我的C文件是用NDK-BUILD编译的

#6


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录


奇怪的是打印了这一行出错信息以后,应该我的C程序出了问题,崩溃了,为什么下一行还有信息打印,那些红色的字体,全部都是打印的C代码中的信息,按理说崩溃了的话,下面就应该没有那些红色的信息了,为什么还在执行呀

#7


该回复于2014-04-18 11:42:33被管理员删除

#8


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

我用了最笨的方法来找是哪一行代码出了问题,所以加了很多的打印信息,在Fatal signal 11出现的时候,前后的打印信息是连着的,比如
if (play->m_vo_ctx)
{
LOGE("before free_video_render1 exist!!");
free_video_render(play->m_vo_ctx);
LOGE("after free_video_render1 exist!!");
play->m_vo_ctx = NULL;
}

if (bFreeThread)
{
bFreeThread = FALSE;
JavaVM *av2_vm = av_get_jvm();
(*av2_vm)->DetachCurrentThread(av2_vm);
LOGE("DetachCurrentThread 3 exit!!");
}


LOGE("video_render_thrd exist!!");

当打印完after free_video_render1 exist!!后就抱错了,但是后面的DetachCurrentThread 3 exit!!跟video_render_thrd exist!!还在继续打印,如上图所示,测试了很多次,报这个错误的时候有可能在打印完av_stop 3跟av_stop 4之间,或者其它的打印信息之间,但是这两句打印信息之间并没有什么错误,所以都不知道怎么确定到底是哪里的代码出了问题了

#9


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

#10


引用 9 楼 lanjian1111 的回复:
Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

#11


引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

前辈说的adb logcat是指的什么?我可以试试看

#12


引用 11 楼 lanjian1111 的回复:
前辈说的adb logcat是指的什么?我可以试试看

window->show views->logcat

#13


引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

adb logcat是在Eclipse中设置么

#14


android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

#15


引用 12 楼 hjywyj 的回复:
Quote: 引用 11 楼 lanjian1111 的回复:

前辈说的adb logcat是指的什么?我可以试试看

window->show views->logcat

那就是Eclipse中的LogCat了

#16


学习了!!!!!!!!!!

#17


引用 14 楼 lanjian1111 的回复:
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

#18


我已经把这些错误导出成了一个TXT文件

引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

我已经吧这些错误导出成了一个TXT文件,然后按照这个方法执行
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump log.txt

log.txt是导出的出错文件,我吧这个文件放到了NDK目录下面,然后在NDK中执行
ndk-stack -sym E:/myEclipseWorkPlace/Android_855play/obj/local/armeabi -dump log.txt

分析出来的结果跟程序一点关系都没有
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!

#19


引用 17 楼 luowenlong860502 的回复:
Quote: 引用 14 楼 lanjian1111 的回复:

android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

如何定位

引用 17 楼 luowenlong860502 的回复:
Quote: 引用 14 楼 lanjian1111 的回复:

android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

谢谢前辈的指点,用这个命令确实可以
addr2line -e E:/myEclipseWorkPlace/Android_855play/obj/local/armeabi/libavplayer.so 00140160

不过不知道为什么,我用Android ndk-stack,定位不了

#20


好复杂啊!!!

#21


关于addr2line的用法,请看这个帖子:http://blog.csdn.net/andyhuabing/article/details/7074979。
主要是里面说的库文件要找到的目录是:out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED,我已经试过,可以得到行数。

#22


请问out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED
这个目录在哪里?我翻遍了项目文件都没有找到

#1


贴一下自己的在LogCat中的打印信息如下
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
奇怪的是程序已经报错了,下面还有C写的打印信息,难道不是出错了JNI中的C代码马上就停止运行了吗

#2


我在我的SO文件下NDK中执行addr2line -e libavplayer.so 61b5c482后得到的结果是??:0
是不是我这样的方式不对,我的SO文件是几个静态的a文件编译后产生的SO文件

#3


LOG中并没有看到挂掉的堆栈信息啊 一般像这种

04-15 11:06:53.859 F/libc    ( 2398): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

04-15 11:06:53.869 I/DEBUG   ( 1274): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

04-15 11:06:53.869 I/DEBUG   ( 1274): Build fingerprint: 'Xiaomi/mione_plus/mione_plus:4.0.4/IMM76D/ICS24.0:user/release-keys'

04-15 11:06:53.869 I/DEBUG   ( 1274): pid: 2398, tid: 2555  >>> org.linphone <<<

04-15 11:06:53.869 I/DEBUG   ( 1274): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r0 00fad7d0  r1 00000000  r2 000000a0  r3 00000050

04-15 11:06:53.869 I/DEBUG   ( 1274):  r4 00fbf180  r5 00000000  r6 5cfd59a0  r7 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r8 5cfd5820  r9 5cfd5814  10 5cfd58a0  fp 5cfd5818

04-15 11:06:53.869 I/DEBUG   ( 1274):  ip 00000001  sp 5cfd5804  lr 5c8546e4  pc 40050cc8  cpsr 80000010

04-15 11:06:53.869 I/DEBUG   ( 1274):  d0  0000000000000000  d1  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d2  0000000000000000  d3  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d4  0000000000000000  d5  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d6  0000000000000000  d7  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d8  400d9aa353e247de  d9  401c3fb69984a0e5

04-15 11:06:53.869 I/DEBUG   ( 1274):  d10 412e848000000000  d11 408f400000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d12 3feccccccccccccd  d13 4059000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d14 3fb9999999999998  d15 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d16 0000000000000000  d17 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d18 0000000000000000  d19 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d20 0000000000000000  d21 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d22 0000000000000000  d23 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d24 0000000000000000  d25 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d26 0000000000000000  d27 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d28 0000000000000000  d29 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d30 ffffffffffffffff  d31 ffffffffffffffff

04-15 11:06:53.869 I/DEBUG   ( 1274):  scr 60000012


里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

#4


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

04-15 11:06:53.859 F/libc    ( 2398): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

04-15 11:06:53.869 I/DEBUG   ( 1274): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

04-15 11:06:53.869 I/DEBUG   ( 1274): Build fingerprint: 'Xiaomi/mione_plus/mione_plus:4.0.4/IMM76D/ICS24.0:user/release-keys'

04-15 11:06:53.869 I/DEBUG   ( 1274): pid: 2398, tid: 2555  >>> org.linphone <<<

04-15 11:06:53.869 I/DEBUG   ( 1274): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r0 00fad7d0  r1 00000000  r2 000000a0  r3 00000050

04-15 11:06:53.869 I/DEBUG   ( 1274):  r4 00fbf180  r5 00000000  r6 5cfd59a0  r7 00000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  r8 5cfd5820  r9 5cfd5814  10 5cfd58a0  fp 5cfd5818

04-15 11:06:53.869 I/DEBUG   ( 1274):  ip 00000001  sp 5cfd5804  lr 5c8546e4  pc 40050cc8  cpsr 80000010

04-15 11:06:53.869 I/DEBUG   ( 1274):  d0  0000000000000000  d1  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d2  0000000000000000  d3  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d4  0000000000000000  d5  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d6  0000000000000000  d7  0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d8  400d9aa353e247de  d9  401c3fb69984a0e5

04-15 11:06:53.869 I/DEBUG   ( 1274):  d10 412e848000000000  d11 408f400000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d12 3feccccccccccccd  d13 4059000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d14 3fb9999999999998  d15 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d16 0000000000000000  d17 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d18 0000000000000000  d19 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d20 0000000000000000  d21 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d22 0000000000000000  d23 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d24 0000000000000000  d25 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d26 0000000000000000  d27 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d28 0000000000000000  d29 0000000000000000

04-15 11:06:53.869 I/DEBUG   ( 1274):  d30 ffffffffffffffff  d31 ffffffffffffffff

04-15 11:06:53.869 I/DEBUG   ( 1274):  scr 60000012


里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

没有啊,我只看到了Fatal signal 11 (SIGSEGV) at XXXXX,没有看到像你切图那样的东西哦
这是我Eclipse中提示的打印信息,为什么我的没有像你切图里面Debug信息
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!

#5


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录


搜寻了一下,可以用Android ndk-stack tool
来查看产生这个错误的原因,但是出错的时候我的Eclipse中没有看到有*号开始的那些提示信息

我是用真机测试的,在工程目录下的jni文件夹下Application.mk中添加 APP_OPTIM := debug,我的C文件是用NDK-BUILD编译的

#6


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录


奇怪的是打印了这一行出错信息以后,应该我的C程序出了问题,崩溃了,为什么下一行还有信息打印,那些红色的字体,全部都是打印的C代码中的信息,按理说崩溃了的话,下面就应该没有那些红色的信息了,为什么还在执行呀

#7


该回复于2014-04-18 11:42:33被管理员删除

#8


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

我用了最笨的方法来找是哪一行代码出了问题,所以加了很多的打印信息,在Fatal signal 11出现的时候,前后的打印信息是连着的,比如
if (play->m_vo_ctx)
{
LOGE("before free_video_render1 exist!!");
free_video_render(play->m_vo_ctx);
LOGE("after free_video_render1 exist!!");
play->m_vo_ctx = NULL;
}

if (bFreeThread)
{
bFreeThread = FALSE;
JavaVM *av2_vm = av_get_jvm();
(*av2_vm)->DetachCurrentThread(av2_vm);
LOGE("DetachCurrentThread 3 exit!!");
}


LOGE("video_render_thrd exist!!");

当打印完after free_video_render1 exist!!后就抱错了,但是后面的DetachCurrentThread 3 exit!!跟video_render_thrd exist!!还在继续打印,如上图所示,测试了很多次,报这个错误的时候有可能在打印完av_stop 3跟av_stop 4之间,或者其它的打印信息之间,但是这两句打印信息之间并没有什么错误,所以都不知道怎么确定到底是哪里的代码出了问题了

#9


引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

#10


引用 9 楼 lanjian1111 的回复:
Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

#11


引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

前辈说的adb logcat是指的什么?我可以试试看

#12


引用 11 楼 lanjian1111 的回复:
前辈说的adb logcat是指的什么?我可以试试看

window->show views->logcat

#13


引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

adb logcat是在Eclipse中设置么

#14


android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

#15


引用 12 楼 hjywyj 的回复:
Quote: 引用 11 楼 lanjian1111 的回复:

前辈说的adb logcat是指的什么?我可以试试看

window->show views->logcat

那就是Eclipse中的LogCat了

#16


学习了!!!!!!!!!!

#17


引用 14 楼 lanjian1111 的回复:
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

#18


我已经把这些错误导出成了一个TXT文件

引用 10 楼 luowenlong860502 的回复:
Quote: 引用 9 楼 lanjian1111 的回复:

Quote: 引用 3 楼 luowenlong860502 的回复:

LOG中并没有看到挂掉的堆栈信息啊 一般像这种

里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录

前辈说的LOG,是Eclipse中的LogCat 还是?

Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全

我已经吧这些错误导出成了一个TXT文件,然后按照这个方法执行
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump log.txt

log.txt是导出的出错文件,我吧这个文件放到了NDK目录下面,然后在NDK中执行
ndk-stack -sym E:/myEclipseWorkPlace/Android_855play/obj/local/armeabi -dump log.txt

分析出来的结果跟程序一点关系都没有
android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!

#19


引用 17 楼 luowenlong860502 的回复:
Quote: 引用 14 楼 lanjian1111 的回复:

android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

如何定位

引用 17 楼 luowenlong860502 的回复:
Quote: 引用 14 楼 lanjian1111 的回复:

android调用JNI报Fatal signal 11 (SIGSEGV) at XXXXX的问题,高分求教大家!!!!!
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数

很明显,挂掉的地方在libavplayer.so  定位00140160即可知道 哪一行出问题

谢谢前辈的指点,用这个命令确实可以
addr2line -e E:/myEclipseWorkPlace/Android_855play/obj/local/armeabi/libavplayer.so 00140160

不过不知道为什么,我用Android ndk-stack,定位不了

#20


好复杂啊!!!

#21


关于addr2line的用法,请看这个帖子:http://blog.csdn.net/andyhuabing/article/details/7074979。
主要是里面说的库文件要找到的目录是:out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED,我已经试过,可以得到行数。

#22


请问out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED
这个目录在哪里?我翻遍了项目文件都没有找到