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

lanjian1111 2014-04-17 06:10:00
RT,安卓在调用底层JNI的C代码的时候出现的问题,反复的调用久了就会出现这样的问题,但是我看C代码又看不出来什么问题,报了这样错误以后,用C写的代码还有打印信息,都不好定位错误在哪一行,参考这位高人的文章http://zzhhui.blog.sohu.com/266543920.html,其中有很多的困惑,请大家指点一点,平时都是怎么调试JNI的,要是能根据提示的地址XXXXX跟SO文件能定位到所出问题的函数或者代码行就好了,这位前辈的文章中有说到用addr2line 命令,我有试过用这个命令,再加上我的SO文件所在的目录,但是在NDK中执行了之后没有得到出错代码行的信息
...全文
20810 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuminminmin 2016-11-03
  • 打赏
  • 举报
回复
请问out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED 这个目录在哪里?我翻遍了项目文件都没有找到
star0906 2015-09-30
  • 打赏
  • 举报
回复
关于addr2line的用法,请看这个帖子:http://blog.csdn.net/andyhuabing/article/details/7074979。 主要是里面说的库文件要找到的目录是:out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED,我已经试过,可以得到行数。
qq_14998215 2015-09-29
  • 打赏
  • 举报
回复
好复杂啊!!!
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
前辈说的LOG,是Eclipse中的LogCat 还是?
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 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之间,或者其它的打印信息之间,但是这两句打印信息之间并没有什么错误,所以都不知道怎么确定到底是哪里的代码出了问题了
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
奇怪的是打印了这一行出错信息以后,应该我的C程序出了问题,崩溃了,为什么下一行还有信息打印,那些红色的字体,全部都是打印的C代码中的信息,按理说崩溃了的话,下面就应该没有那些红色的信息了,为什么还在执行呀
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 3 楼 luowenlong860502 的回复:
LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
搜寻了一下,可以用Android ndk-stack tool 来查看产生这个错误的原因,但是出错的时候我的Eclipse中没有看到有*号开始的那些提示信息 我是用真机测试的,在工程目录下的jni文件夹下Application.mk中添加 APP_OPTIM := debug,我的C文件是用NDK-BUILD编译的
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 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信息

媒体盒子 2014-04-18
  • 打赏
  • 举报
回复
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目录
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 17 楼 luowenlong860502 的回复:
[quote=引用 14 楼 lanjian1111 的回复:] 选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数
很明显,挂掉的地方在libavplayer.so 定位00140160即可知道 哪一行出问题[/quote] 如何定位
引用 17 楼 luowenlong860502 的回复:
[quote=引用 14 楼 lanjian1111 的回复:] 选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数
很明显,挂掉的地方在libavplayer.so 定位00140160即可知道 哪一行出问题[/quote] 谢谢前辈的指点,用这个命令确实可以 addr2line -e E:/myEclipseWorkPlace/Android_855play/obj/local/armeabi/libavplayer.so 00140160 不过不知道为什么,我用Android ndk-stack,定位不了
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
我已经把这些错误导出成了一个TXT文件

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

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

前辈说的LOG,是Eclipse中的LogCat 还是?[/quote]
Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全[/quote]
我已经吧这些错误导出成了一个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

分析出来的结果跟程序一点关系都没有
媒体盒子 2014-04-18
  • 打赏
  • 举报
回复
引用 14 楼 lanjian1111 的回复:
选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数
很明显,挂掉的地方在libavplayer.so 定位00140160即可知道 哪一行出问题
illhan98 2014-04-18
  • 打赏
  • 举报
回复
学习了!!!!!!!!!!
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 12 楼 hjywyj 的回复:
[quote=引用 11 楼 lanjian1111 的回复:] 前辈说的adb logcat是指的什么?我可以试试看
window->show views->logcat[/quote] 那就是Eclipse中的LogCat了
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复

选择All messages确实可以看见这个,我的动态库文件是libavplayer.so,图片中选中的那一句是不是就是报的错误函数,工程中确实也有update_textures_with_yuv这个函数
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 10 楼 luowenlong860502 的回复:
[quote=引用 9 楼 lanjian1111 的回复:] [quote=引用 3 楼 luowenlong860502 的回复:] LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
前辈说的LOG,是Eclipse中的LogCat 还是?[/quote] Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全[/quote] adb logcat是在Eclipse中设置么
  • 打赏
  • 举报
回复
引用 11 楼 lanjian1111 的回复:
前辈说的adb logcat是指的什么?我可以试试看
window->show views->logcat
lanjian1111 2014-04-18
  • 打赏
  • 举报
回复
引用 10 楼 luowenlong860502 的回复:
[quote=引用 9 楼 lanjian1111 的回复:] [quote=引用 3 楼 luowenlong860502 的回复:] LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
前辈说的LOG,是Eclipse中的LogCat 还是?[/quote] Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全[/quote] 前辈说的adb logcat是指的什么?我可以试试看
媒体盒子 2014-04-18
  • 打赏
  • 举报
回复
引用 9 楼 lanjian1111 的回复:
[quote=引用 3 楼 luowenlong860502 的回复:] LOG中并没有看到挂掉的堆栈信息啊 一般像这种 里面应该有挂掉的堆栈,然后栈顶就是最后挂掉的地方,还有用addr2line 必须是符号库文件,也就是obj目录下的,而不是libs目录
前辈说的LOG,是Eclipse中的LogCat 还是?[/quote] Eclipse 中的log要选 All messages,不能采用过滤,不然就看不到了。最好直接用 adb logcat 来抓,这样比较全
lanjian1111 2014-04-17
  • 打赏
  • 举报
回复
我在我的SO文件下NDK中执行addr2line -e libavplayer.so 61b5c482后得到的结果是??:0 是不是我这样的方式不对,我的SO文件是几个静态的a文件编译后产生的SO文件
加载更多回复(1)

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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