欧博手机app

发布日期:2023-10-24 09:07    点击次数:98

北京赛车娱乐城博彩平台免费下注_Android NDK Crash 定位分析

北京赛车娱乐城博彩平台免费下注_

当拿到欺诈的crash日记,如果是在java层出现了十分,确信各人齐知谈通过堆栈信息查找到奔溃的代码,可是如果是在native层出现了问题,濒临底下的一堆内存地址,有些小伙伴可能就会以为无从下手了:

30597 宝马会真人百家乐30597 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 30597 30597 F DEBUG   : Build fingerprint: 'Xiaomi/chiron/chiron:8.0.0/OPR1.170623.027/V10.3.1.0.ODECNXM:user/release-keys'                 30597 30597 F DEBUG   : Revision: '0' 30597 30597 F DEBUG   : ABI: 'arm64' 30597 30597 F DEBUG   : pid: 30535, tid: 30535, name: me.linjw.ndkdemo  >>> com.me.linjw.ndkdemo <<< 30597 30597 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 30597 30597 F DEBUG   : Abort message: 'Invalid address 0x7ffd3cfac0 passed to free: value not allocated' 30597 30597 F DEBUG   :     x0   0000000000000000  x1   0000000000007747  x2   0000000000000006  x3   0000000000000008 30597 30597 F DEBUG   :     x4   8000000000808080  x5   8000000000808080  x6   8000000000808080  x7   0000000000000008 30597 30597 F DEBUG   :     x8   0000000000000083  x9   d6a0828f4d3c1493  x10  0000000000000000  x11  0000000000000001 30597 30597 F DEBUG   :     x12  ffffffffffffffff  x13  0000000000000001  x14  003275d83bd3efb5  x15  0000c345d3d41566 30597 30597 F DEBUG   :     x16  0000007b582112e8  x17  0000007b581b2d2c  x18  0000007ffd3ce5c8  x19  0000000000007747 30597 30597 F DEBUG   :     x20  0000000000007747  x21  0000007b5520d000  x22  0000000000000000  x23  0000007b5821c878 30597 30597 F DEBUG   :     x24  0000000000000004  x25  0000007b55214c98  x26  0000000000000000  x27  0000000000000001 30597 30597 F DEBUG   :     x28  0000000000000001  x29  0000007ffd3cf8c0  x30  0000007b58166e54                                       30597 30597 F DEBUG   :     sp   0000007ffd3cf880  pc   0000007b581b2d34  pstate 0000000060000000 30597 30597 F DEBUG   : 30597 30597 F DEBUG   : backtrace: 30597 30597 F DEBUG   :     #00 pc 0000000000069d34  /system/lib64/libc.so (tgkill+8) 30597 30597 F DEBUG   :     #01 pc 000000000001de50  /system/lib64/libc.so (abort+88) 30597 30597 F DEBUG   :     #02 pc 0000000000025644  /system/lib64/libc.so (__libc_fatal+116) 30597 30597 F DEBUG   :     #03 pc 0000000000091204  /system/lib64/libc.so (ifree+812) 30597 30597 F DEBUG   :     #04 pc 0000000000091484  /system/lib64/libc.so (je_free+120) 30597 30597 F DEBUG   :     #05 pc 000000000000f60c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (_Z9willCrashv+80) 30597 30597 F DEBUG   :     #06 pc 000000000000f728  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (Java_com_me_linjw_ndkdemo_MainActivity_callNative+20) 30597 30597 F DEBUG   :     #07 pc 000000000000909c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/oat/arm64/base.o 

莫慌,这篇博客就来讲讲奈何分析这份崩溃日记。

[[443052]]

信号领先第一个常识点便是信号(signal)机制,它其实是程度间通讯的一种姿首。在处分ndk crash日记的时期不错大要通晓为诞妄码,它形色了诞妄的大要原因。举例上头的log,不错看到这个法子是因为SIGABRT这个信号奔溃的,它的码字是6:

皇冠客服飞机:@seo3687

06-04 19:05:38.910 30597 30597 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 

咱们常见的信号有底下这些:

太阳城集团官方网站

从表内部咱们知谈SIGABRT信号的触发原因是通过C函数abort()发送为assert()使用,也便是说它是个断言失败,从日记内部咱们还能看到abort的信息:

作为博彩行业的领先者之一,我们拥有最专业的博彩攻略和技巧分享,以及最全面、最优质的博彩服务和最多样化的博彩游戏和赛事直播,让广大博彩爱好者能够在博彩游戏中尽情享受博彩乐趣。
Abort message: 'Invalid address 0x7ffd3cfac0 passed to free: value not allocated' 

堆栈分析可是光知谈SIGABRT信号咱们是很难定位到问题的。是以咱们还需要分析底下的堆栈信息,找到对应的代码:

30597 30597 F DEBUG   : backtrace: 30597 30597 F DEBUG   :     #00 pc 0000000000069d34  /system/lib64/libc.so (tgkill+8) 30597 30597 F DEBUG   :     #01 pc 000000000001de50  /system/lib64/libc.so (abort+88) 30597 30597 F DEBUG   :     #02 pc 0000000000025644  /system/lib64/libc.so (__libc_fatal+116) 30597 30597 F DEBUG   :     #03 pc 0000000000091204  /system/lib64/libc.so (ifree+812) 30597 30597 F DEBUG   :     #04 pc 0000000000091484  /system/lib64/libc.so (je_free+120) 30597 30597 F DEBUG   :     #05 pc 000000000000f60c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (_Z9willCrashv+80) 30597 30597 F DEBUG   :     #06 pc 000000000000f728  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (Java_com_me_linjw_ndkdemo_MainActivity_callNative+20) 30597 30597 F DEBUG   :     #07 pc 000000000000909c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/oat/arm64/base.odex (offset 0x9000) 

从这里咱们不错分析到libnative-lib.so内部的Java_com_me_linjw_ndkdemo_MainActivity_callNative调用了willCrash函数,然后在willCrash函数内部触发了十分:

北京赛车娱乐城
30597 30597 F DEBUG   :     #05 pc 000000000000f60c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (_Z9willCrashv+80) 30597 30597 F DEBUG   :     #06 pc 000000000000f728  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (Java_com_me_linjw_ndkdemo_MainActivity_callNative+20) 
C++ 编译器的函数名修饰

预防的同学可能会有疑问,函数名明明是表示的_Z9willCrashv,为啥我会说是willCrash?它和底下的Java_com_me_linjw_ndkdemo_MainActivity_callNative有什么分裂?

咱们不错先来望望源代码证据下我莫得骗你:

皇冠体育hg86a

那为什么willCrash在编译之后so内部会酿成_Z9willCrashv?这主若是C++编译器的函数名修饰功能在作怪。由于c++是复旧重载的,也便是只须参数不一样,函数的名字不错相易。

这个重载其确切编译期就能笃定,是以编译器杀青重载的道理是给函数加上修饰符,举例在函数背面拼接上参数类型简写,这里_Z9willCrashv终末拼接的v就代表void,说明该函数莫得参数。

博彩平台免费下注

也便是说诚然你在代码内部写的是相似的函数名,可是在编译之后,重载的函数其实就酿成了不同名字的不同函数。

表现罢了_Z9willCrashv咱们再来说说Java_com_me_linjw_ndkdemo_MainActivity_callNative,为什么它又莫得被修饰呢?原因就在于函数上头的extern "C",它告诉编译器将这个函数动作念c话语的函数来处分。而c话语是莫得重载这一说的,是以也就不会编削它蓝本的函数名。

领导偏移地址

然后法子名+号背面的数字是指的什么?法子行数吗?内容去代码内部看Java_com_me_linjw_ndkdemo_MainActivity_callNative唯惟一溜代码,找不到20行,相似willCrash也莫得80行:

我的世界加速火下载

这里咱们来表现下+号背面的值的道理道理。咱们齐知谈c/c++代码齐是需要编译成二进制文献之后才气运行,而内容上法子便是通过实施二进制文献中的一条条领导来运行的。上头日记中的#06 pc 000000000000f728指的便是出现问题的时期Java_com_me_linjw_ndkdemo_MainActivity_callNative实施到了0x000000000000f728这个地址的领导,此背面的+20指的是这个地址相对法子肇始地址的偏移。

提及来可能相比难以通晓,这里咱们径直通过反汇编libnative-lib.so来匡助通晓。ndk提供了objdump用具用于反汇编,由于不同cpu架构的反编译用具亦然不一样的,各人不错凭证需要找到对应的法子进行反汇编:

LinJW@LinJWdeMacBook-Pro  ~/Library/Android/sdk/ndk  find . -name "*objdump" ./20.0.5594570/toolchains/x86-4.9/prebuilt/darwin-x86_64/bin/i686-linux-android-objdump ./20.0.5594570/toolchains/x86-4.9/prebuilt/darwin-x86_64/i686-linux-android/bin/objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/bin/objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/bin/objdump ./20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/bin/objdump ./20.0.5594570/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/bin/x86_64-linux-android-objdump ./20.0.5594570/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/x86_64-linux-android/bin/objdump ./20.0.5594570/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objdump ./20.0.5594570/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/objdump ./20.0.5594570/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/aarch64-linux-android/bin/objdump ./20.0.5594570/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump 

我这边使用的是aarch64-linux-android-objdump,敕令如下:

aarch64-linux-android-objdump -S ./libnative-lib.so 

然后咱们搜索Java_com_me_linjw_ndkdemo_MainActivity_callNative找到这个法子的界说:

000000000000f714 <Java_com_me_linjw_ndkdemo_MainActivity_callNative&Base>:     f714:   d10083ff    sub sp, sp, #0x20     f718:   a9017bfd    stp x29, x30, [sp,#16]     f71c:   910043fd    add x29, sp, #0x10     f720:   f90007e0    str x0, [sp,#8]     f724:   f90003e1    str x1, [sp]     f728:   97ffff0a    bl  f350 <_Z9willCrashv@plt>     f72c:   a9417bfd    ldp x29, x30, [sp,#16]     f730:   910083ff    add sp, sp, #0x20     f734:   d65f03c0    ret     f738:   d100c3ff    sub sp, sp, #0x30     f73c:   a9027bfd    stp x29, x30, [sp,#32]     ... 

然后咱们上头看到的pc 000000000000f728其实指的便是f728这个地址的领导,也便是bl领导,这个领导用于调用子法子,于是咱们不错容易猜出这行领导的作用是跳转到willCrash法子:

f728: 97ffff0a bl f350 <_Z9willCrashv@plt> 

而Java_com_me_linjw_ndkdemo_MainActivity_callNative的肇始地址为000000000000f714,于是不错筹谋出000000000000f728相对函数肇始地址的偏移为0xf728-0xf714=0x14,而0x14在十进制内部便是20。

在2022年2月,国家发改委官网发布《国家发改委关于同意长株潭都市圈发展规划的复函》,欧博真人博彩标志着长株潭都市圈都正式批复,成为中部地区第一个。那么都市圈批复之后有什么优势呢?提升地区竞争力,那是位于首位,也将会进一步加强区域一体化发展,优化区域经济结构,实现城市化进程。未来,整个长株潭地区将会成为引领湖南省经济发展的最强核心力。

澳大利亚与美国的关系深厚且基础扎实,因此我的观点是善意的。我们最重要的两种关系,包括战略和经济,是与美国和中国的关系。我们希望这两个国家在相互尊重和理解的基础上进行对话,找到管理困难和问题的方法。目前最根本问题是台湾问题。上帝保佑,不要因台湾问题开战。这将给中国大陆、台湾地区、美国和整个世界带来不可想象的损失。知道我们会遭受多大损失,澳大利亚肯定不会支持美国的军事干预。

addr2line

如果对这些汇编领导相比熟识的话天然不错分析定位问题,可是一般的安卓法子员可能对这块相比生分。是以咱们不错用addr2line用具径直定位到源代码。

咱们从底下log不错获得两个地址000000000000f728、000000000000f60c

30597 30597 F DEBUG   :     #05 pc 000000000000f60c  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (_Z9willCrashv+80) 30597 30597 F DEBUG   :     #06 pc 000000000000f728  /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (Java_com_me_linjw_ndkdemo_MainActivity_callNative+20) 

使用这个敕令的前提是咱们要有带标记的so库,因为一般情况下打包到apk内部的so齐是不带标记的(不错大要通晓成java层的污染,去掉了标记信息),是以如果径直从apk内部解压出so,然后使用addr2line会获得底下效果,全是问号:

新葡京娱乐诈骗
??:? 

带标记的so一般会在编译的历程中生成,是以不错在app/build目次内部递归搜索下,况且不同cpu架构也需要用不同的addr2line,敕令如下:

aarch64-linux-android-addr2line -e ./app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so 000000000000f728 000000000000f60c 

获得效果:

皇冠足球
/Users/LinJW/workspace/NdkDemo/app/src/main/cpp/native-lib.cpp:19 /Users/LinJW/workspace/NdkDemo/app/src/main/cpp/native-lib.cpp:13 

咱们来对比下源码就能找到崩溃的原因是delete了字符串常量的内存:

皇冠体彩下载安装

ndk-stack作为追究看到这里的同学,我必须要奖励勤学的你一个福利,那便是ndk-stack,他也在ndk内部:

NDK目次/prebuilt/darwin-x86_64/bin/ndk-stack 

领先咱们将含有native crash的log保存到crash_log.txt用-dump参数相差,然后将通盘带标记的so放到某个目次下,用-sym参数传入:

ndk-stack -sym ./app/build/intermediates/cmake/debug/obj/arm64-v8a/ -dump ~/Downloads/crash_log.txt 

然后它就会对native堆栈使用addr2line和目次下的so去妥洽,最终输出带标记的堆栈信息:

********* Crash dump: ********** Build fingerprint: 'Xiaomi/chiron/chiron:8.0.0/OPR1.170623.027/V10.3.1.0.ODECNXM:user/release-keys' Abort message: 'Invalid address 0x7ffd3cfac0 passed to free: value not allocated' #00 0x0000000000069d34 /system/lib64/libc.so (tgkill+8) #01 0x000000000001de50 /system/lib64/libc.so (abort+88) #02 0x0000000000025644 /system/lib64/libc.so (__libc_fatal+116) #03 0x0000000000091204 /system/lib64/libc.so (ifree+812) #04 0x0000000000091484 /system/lib64/libc.so (je_free+120) #05 0x000000000000f60c /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (_Z9willCrashv+80)                                                                                                            willCrash()                                                                                                            /Users/LinJW/workspace/NdkDemo/app/src/main/cpp/native-lib.cpp:13:5 #06 0x000000000000f728 /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/lib/arm64/libnative-lib.so (Java_com_me_linjw_ndkdemo_MainActivity_callNative+2 0)                                                                                                            Java_com_cvte_tv_ndkdemo_MainActivity_callNative                                                                                                            /Users/LinJW/workspace/NdkDemo/app/src/main/cpp/native-lib.cpp:19:5 #07 0x000000000000909c /data/app/com.me.linjw.ndkdemo-qgq0-FTl7SRsBBdmCeMAdg==/oat/arm64/base.odex (offset 0x9000) 

ndk-stack在启动领悟 logcat 输出时将查找第一溜星号,是以拷贝的时期难忘这行不可枯竭:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 

天然频频情况下咱们径直将logcat出来的通盘日记传给它就好,它会自动凭证星号行识别出native堆栈:

adb logcat | ndk-stack旅途 -sym 存放带标记so库目次的旅途