日志获取
正常日志获取
- AndroidStudio直接查看logcat窗口
- 通过adb指令获取
// 日志持续输出到命令行窗口
adb logcat
// 持续输出到指定文件(打印日志详细时间)
adb logcat -v time > d:\log.txt
// 带过滤的日志输出(指定日志标签TAG)
adb logcat -s xxx
// 带过滤的日志输出(日志级别是Error)
adb logcat -v time *:E
// 清空日志缓冲区
adb logcat -c
// 查看日志缓冲区
adb logcat -g
// 设置日志缓冲区大小;某些手机或定制机日志缓冲区不足,需要设置
adb logcat -G 150M
// monkey测试指令
adb shell monkey -p com.curry.xxx --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 100000000 >D:\monkey.txt
无法获取anr/tombstones
有些手机无法直接获取data/目录下的anr日志,/tombstones日志等;提示Permission denied
解决方式
- 将手机root;
- 通过
adb bugreport获取;获取并阅读 bug 报告
adb分析线程
查看进程ID
adb shell "ps|grep 包名"
或
adb shell ps | find "包名"
查看线程总数Threads,以及其他信息
adb shell cat /proc/app的pid/status
获取详细的线程列表
adb shell
ps -T -p app的pid
实时监控进程中线程状况
adb shell
top -H -p app的pid
native日志排查
ndk-stack
- 需要分析的日志必须要带有一行*号
ndk-stack -sym D:\company_rs\project\SDK\ANDROID_AC020_SDK\ac020library\build\intermediates\cxx\Debug\4b291936\obj\arm64-v8a -dump C:\Users\admin\Desktop\dumpstate-2025-04-24-08-54-06\FS\data\tombstones\tombstone_14
addline
没有指向实际的行数
D:\Android\Sdk\ndk\21.1.6352462\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin>aarch64-linux-android-addr2line.exe -e D:test.so 000000000007ea80 D://Android/Sdk/ndk/25.0.8775105/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/bits/fortify/string.h:61
这是一个非常典型的 NDK 调试现象。
addr2line 的结果指向 string.h 的第 61 行,是因为编译器为了优化性能或进行安全检查(FORTIFY_SOURCE),将标准库函数 memcpy 内联 (inline) 到了你的代码中。
具体来说:
- 内联函数: 你的
yyy::xxx调用了memcpy。 - 系统头文件: 编译器引用了 NDK 系统头文件
string.h中对memcpy的定义(通常是一个包装器,用于检查缓冲区大小是否溢出)。 - 结果: 崩溃发生时,指令指针虽然逻辑上在你的函数内,但源码行号映射到了被内联进来的系统头文件里。
这意味着:我们确信崩溃是由 memcpy 引起的,但 addr2line 没能直接告诉你它是 yyy.cpp 里的哪一行。
给 addr2line 加上 -i (inlines) 参数,让它展开内联函数调用栈,这通常能显示出“上一层”调用者(即你的代码)。
请运行:
cmd
aarch64-linux-android-addr2line.exe -C -f -i -e D:\company_rs\project\SDK\ANDROID_GPU_SDK\app\src\main\cpp\android\libs\arm64-v8a\libgpu_image.so 000000000007ea80
日志举例
--------- beginning of crash
2025-04-25 11:04:24.769 2315-2541 libc com.xxx.yyyy A Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x80ed80fa in tid 2541 (Thread-13), pid 2315 (xxx.yyyy)
// 一行*日志
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Build fingerprint: 'samsung/dm1qzcx/dm1q:14/UP1A.231005.007/S9110ZCS3CXE3:user/release-keys'
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Revision: '14'
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A ABI: 'arm64'
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Processor: '7'
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Timestamp: 2025-04-25 11:04:24.887337923+0800
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Process uptime: 74s
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A Cmdline: com.xxx.yyyy
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A pid: 2315, tid: 2541, name: Thread-13 >>> com.xxx.yyyy <<<
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A uid: 10693
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000080ed80fa
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x0 00000076b6987900 x1 000000006fc43eb8 x2 000000766a0136d8 x3 0000000000000000
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x4 000000766a0136e0 x5 0000000000018000 x6 0000000000018000 x7 0000000000000000
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x8 0000000080ed80ee x9 0000000000000000 x10 000000766a0133c8 x11 00000077d52c0a34
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x12 0000000000000001 x13 000000766a01346c x14 0000000000000000 x15 00000077d7ece8a0
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x16 000000766a0136d8 x17 000000786d10ad58 x18 0000007644950000 x19 000000766a0136e0
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x20 000000766a015000 x21 0000000000018000 x22 000000003e9b9000 x23 0000000000018000
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x24 0000000000000004 x25 000000779b6e5000 x26 0000000000000002 x27 00000000000000c0
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A x28 0000000000000000 x29 000000766a0135c0
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A lr 00000000643baca0 sp 000000766a013540 pc 00000077d8393f4c pst 0000000020001000
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A 22 total frames
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A backtrace:
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #00 pc 0000000000593f4c /apex/com.android.art/lib64/libart.so (art::System_arraycopy(_JNIEnv*, _jclass*, _jobject*, int, _jobject*, int, int) (.__uniq.110717464938643750821353004938495288567)+88) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #01 pc 000000000200ac9c /memfd:jit-cache (deleted) (offset 0x2000000) (art_jni_trampoline+156)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #02 pc 0000000002007454 /memfd:jit-cache (deleted) (offset 0x2000000) (com.xxx.zzzz.ddd.manager.lambda$initData$0$com-xxx-zzzz-ddd-manager+2980)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #03 pc 000000000033eba4 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #04 pc 0000000000512a24 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+1976) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #05 pc 0000000000495e6c /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #06 pc 0000000000357dd8 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #07 pc 000000000000b140 /data/data/com.xxx.yyyy/code_cache/.overlay/base.apk/classes3.dex (com.xxx.zzzz.ddd.manager$$ExternalSyntheticLambda0.onFrame+0)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #08 pc 0000000000371b14 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.8722505846101882172)+232) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #09 pc 000000000037140c /apex/com.android.art/lib64/libart.so (artQuickToInterpreterBridge+964) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #10 pc 0000000000355768 /apex/com.android.art/lib64/libart.so (art_quick_to_interpreter_bridge+88) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #11 pc 000000000033eba4 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #12 pc 000000000033cc28 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithVarArgs<art::ArtMethod*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, std::__va_list)+772) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #13 pc 000000000057a7d0 /apex/com.android.art/lib64/libart.so (art::JNI<true>::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+192) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #14 pc 00000000003de194 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallMethodV(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, std::__va_list, art::Primitive::Type, art::InvokeType) (.__uniq.99033978352804627313491551960229047428)+624) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #15 pc 000000000054e828 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list) (.__uniq.99033978352804627313491551960229047428.llvm.362250457533049209)+72) (BuildId: 02bec5940be704b863f6514fc7d81c41)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #16 pc 000000000000c5fc /data/app/~~5QY3-GZiFe6mQ1y3-KfZ7A==/com.xxx.yyyy-dRVNNDbPq6_gW-Eloxkm2g==/base.apk!libAsdk.so (offset 0x9c8000) (_JNIEnv::CallVoidMethod(_jobject*, _jmethodID*, ...)+208) (BuildId: a3deebea478d0832e3c02fc09062f85545c60b7a)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #17 pc 000000000000c3c4 /data/app/~~5QY3-GZiFe6mQ1y3-KfZ7A==/com.xxx.yyyy-dRVNNDbPq6_gW-Eloxkm2g==/base.apk!libAsdk.so (offset 0x9c8000) (frame_callback(void*, void*)+436) (BuildId: a3deebea478d0832e3c02fc09062f85545c60b7a)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #18 pc 00000000000575ac /data/app/~~5QY3-GZiFe6mQ1y3-KfZ7A==/com.xxx.yyyy-dRVNNDbPq6_gW-Eloxkm2g==/base.apk!libBsdk.so (offset 0x65e8000) (do_filter_noise()+1352) (BuildId: 82cb45e43af8819382f7730ce07298bb020c8263)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #19 pc 00000000000580c4 /data/app/~~5QY3-GZiFe6mQ1y3-KfZ7A==/com.xxx.yyyy-dRVNNDbPq6_gW-Eloxkm2g==/base.apk!libBsdk.so (offset 0x65e8000) (filter_noise_thread_func(void*)+24) (BuildId: 82cb45e43af8819382f7730ce07298bb020c8263)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #20 pc 00000000000fd0f4 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: 02a91a85343debb2911714273ff2b670)
2025-04-25 11:04:25.223 3885-3885 DEBUG pid-3885 A #21 pc 0000000000096a04 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68) (BuildId: 02a91a85343debb2911714273ff2b670)
ANR日志排查
..TODO