android系统中调试Java非常容易,一般遇到错误都在logcat中打印出错时函数的调用关系,
而C库中出错时只看到一些二进制信息,使用gdbserver调试环境搭建又比较复杂。
方法一:
下在介绍一个简单的调试库的方法,当然需要有so库的源代码
举例
a) 错误信息如下,它表示了出错时的函数调用关系(下面调上面的)
I/DEBUG ( 634): #00 pc 000078e6 /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #01 pc 000087bc /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #02 pc 0000e94e /system/lib/libsensorservice.so
I/DEBUG ( 634): #03 pc 0000a790 /system/lib/libsensorservice.so
I/DEBUG ( 634): #04 pc 0000d4b2 /system/lib/libsensorservice.so
I/DEBUG ( 634): #05 pc 0000d852 /system/lib/libsensorservice.so
I/DEBUG ( 634): #06 pc 00015ece /system/lib/libutils.so
I/DEBUG ( 634): #07 pc 0000153a /system/lib/libsystem_server.so
I/DEBUG ( 634): #08 pc 00001756 /system/lib/libsystem_server.so
I/DEBUG ( 634): #09 pc 0000adb8 /system/lib/libandroid_servers.so
I/DEBUG ( 634): #10 pc 00011cb4 /system/lib/libdvm.so
b)进入源码中带符号表的so库所在目录
$ cd out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED
这个有个需要注意的地方:
对于可执行程序及动态库,一般在LINKED子目录中是带有符号的库(没有经过符号剥离),如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。
c)用addr2line命令找到地址对应的程序位置,动态库为libmultiplayerservice.so
arm-eabi-addr2line 000078e6 -e libmultiplayerservice.so
结果:,显示出对应的程序文件和行数,如果不是debug版本,可能有一两行偏差
frameworks/base/services/multiplayerservice/PlayerSocket.cpp 421 行
d)注意
arm-eabi_addr2line在prebuild/linux-x86/toolchain/arm-eabi-xxx/bin目录下,
运行build/envsetup.sh后即可直接使用它,同目录下的objdump, nm也是常用调试命令
方法二:
google提供了一个python脚本,可以从 http://code.google.com/p/android-ndk-stacktrace-analyzer/ 下载这个python脚本,然后使用
adb logcat -d > logfile 导出 crash 的log,
使用 arm-eabi-objdump (位于build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面)把so或exe转换成汇编代码,如:
arm-eabi-objdump -S mylib.so > mylib.asm,
然后使用脚本
python parse_stack.py <asm-file> <logcat-file>
方法2使用非常方便,相比于加打印效率大大提高。
方法三:
cat logcat_3.log | ndk-stack -sym ~/[SOURCE-DIR]/out/target/product/[PROJECT]/symbols/system/lib/
相关推荐
#### 动态库死机调试方法 - **概述**:当应用程序加载的动态库出现异常时,可能导致应用程序崩溃或挂起。 - **解决方法**: - 使用 `gdb` 或 `lldb` 进行动态库的调试。 - 在出现问题时捕获堆栈信息,分析具体的...
在Android系统中,黑屏死机(Black Screen Freeze,BSF)是一种常见的故障现象,它可能由多种原因引起。在本案例中,问题发生在设备在播放土豆视频时,且与充电状态有关。从标题和描述中,我们可以提取出以下几个...
六、动态库死机调试方法 针对动态库(如.so文件)引起的死机,可以使用`gdbserver`配合`gdb`进行远程调试,设置断点并查看调用栈,找出问题所在。 七、Oops问题的调试和定位 Oops通常是由于系统层面的错误,如内核...
### WebLogic宕机问题及其解决策略 #### 一、引言 在现代企业级应用部署中,Oracle WebLogic Server作为一款高性能的企业级Java应用服务器,因其稳定性和强大的功能集受到广泛青睐。然而,在实际生产环境中,...
Android系统抓取slog方法 如死机重启log kernellog等等
如发生在 mysql 软件可承受力够但是服务器硬件,或者其他服务导致的 宕机 又或者 MYSQL 参数配置过大或者参数配置不合理...,出现宕机的可能多种多样,本文档主要体现的是宕机后可能出现的问题和后遗症较大的情况是什么
在IT行业中,"永不宕机的...通过上述方法的组合应用,可以显著提高系统的可用性,减少宕机事件的发生,保障企业的正常运营。当然,没有绝对的“永不宕机”,但通过持续努力和技术创新,我们可以无限接近这个目标。
tomcat宕机重启脚本,比较简单的一种设置
LNH_MySQL 19-企业场景一主多从宕机从库宕机解决.mp4
宕机检测工具就是为了这个目的而设计的,它能够实时监控服务器状态,及时发现并报警服务异常,避免因服务器宕机导致的业务中断。本文将深入探讨宕机检测工具的工作原理、功能特性以及如何运用这些工具来提升系统稳定...
嵌入式系统的死机调试主要涉及到了解和诊断在开发过程中出现的软件故障。根据提供的文件内容,我们可以了解到以下几个重要知识点: 一、故障系统概述(Fault System Overview) 在Stellaris Cortex™-M处理器中,...
在处理WebLogic宕机问题时,我们首先遇到的是与数据库相关的优化问题。在这个场景中,项目组最初认为数据库是问题所在,因为SGA(System Global Area)使用的是默认参数,导致缓冲区命中率低。这可能意味着数据读取...
服务器宕机的应急预案 服务器宕机是一种常见的IT灾难,它可能会导致业务中断、数据丢失和经济损失。因此,拥有一个完善的服务器故障应急预案对于企业的正常运营至关重要。本文将讨论服务器宕机的原因、备份和冗余...
在低版本的智能电视盒子上,由于硬件资源有限和系统优化不足,加载动态库可能更为复杂。gnustl作为C++运行时库,它的加载过程涉及到符号解析、内存分配、线程支持等,这些操作在资源紧张的环境下可能出现问题。特别...
然而,当GitLab服务器遭遇宕机时,可能会导致开发者无法正常进行代码的提交和下载,这对任何依赖GitLab进行日常开发工作的团队来说都是一个重大的挑战。本文将详细解释如何在GitLab服务器宕机后恢复代码仓库,确保...
在Android操作系统中,有时我们需要在应用程序中执行重启手机的操作,比如在系统更新或者特定故障修复后。本篇文章将深入探讨如何在Android应用中实现手机的重启功能,以及相关的编程细节和注意事项。 首先,我们...
### MySQL 主备机宕机自动切换详解 #### 一、MySQL主备复制机制简介 MySQL复制(Replication)是MySQL数据库系统中一个重要的特性,它允许数据从一台MySQL服务器(称为Master)复制到另一台或多台MySQL服务器...
更重要的是,nginx还提供了宕机自动切换的能力,这确保了在某后端服务器发生故障时,能够快速切换到健康节点继续提供服务,从而保障了服务的连续性和稳定性。 在nginx中进行负载均衡配置,一般会利用到默认安装的...
标题提到的"Eclipse自动提示卡死机(尤其android开发时候)补丁"正是为了解决这个问题而提供的一个解决方案。 Eclipse的自动提示功能是其一大亮点,它能够智能地根据代码上下文提供可能的API、变量和方法,帮助...
RAC 节点宕机故障分析是指在 Oracle Real Application Clusters(RAC)环境中,节点宕机故障的诊断和解决方法。在这个主题中,我们将重点介绍 RAC 节点宕机故障的分析和解决方法,涵盖 ALERT 告警文件分析、事件分析...