一次JNI调试记录

android ndk编程

在gsm语音监听库编译arm64-v8a库时, 总是会出现闪退

这样的闪退, android studio 的logcat也看不出日志, 所以还是要使用adb logcat 将日志存储在文件中分析

首先尝试了在 cmake 中添加 -std-gnu99 -g 使so 库可调试,看看是不是因为标准的问题, 这个时候就显示出gui 工具的局限性。根本debug不了

直接运行so 库, 使用gdb调试呢? 这个方法虽然可行, 但是一时间感觉不能保存现场, 现在看来并不是不好做, 也只是两个文件路径而已,且都己经保存在了本地。 再加上gdb也不熟悉, 所以此方法就暂时搁置了。

然后就从日志入手, 日志只有一些堆栈的信息, backtrace stack, 给了地址和so 库的名字,这样明显是跟java中直接定位出代码位置是一样的么。
所以,理论上是有工具翻译出出错的代码位置的。

网上搜索, 必然是有的, 直接在ndk 包中的 linux/llvm/prebuilt/x86_64/ 下的 addr2line 工具,addr2line -f -e 然后就能定位出代码位置,
需要加 -g 的参数,.so 库才会记录位置信息. 其他 .elf, .a 是同样的

一时间发版本, 也没有心思去深入研究,只是根据这个地址找到了出错的位置, 原来是数据超出范围了. word16 的数据,只能处理 0 – 0x7ffffff 大小的数据,现在全变成负数了, 直接将入参改成 word32 也并没有效果,所以这时候还是犯了数据类型转换的错误,
虽然规避了超出范围不abort, 但是声音就完全失真了,为了发版本, 也只是改到这里, 下一次,有环境的时候,可以再验证一下类型转换后能否可行。 猜测是arm64-v8a平台采集的数据,已经将声音数据范围扩展了,这个库也是10年前的库了, 中间没有再维护

这个过程,也算是体会到了ndk 下开发的调试过程, 其实最终的基本功还是linux下c/c++ 的开发gdb调试过程, 后面再加强学习, 先记录如此。

版权声明:除特殊说明,博客文章均为Sophimp原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇