Android NDK定位.so文件crash代码位置
参考:http://blog.csdn.net/xyang81/article/details/42319789
问题: QRD8926_110202平台的Browser必现报错。(去年的项目,客户反馈问题,提case让QRD提供技术支持)
测试步骤:浏览一会新闻或其他网站(>=3分钟),然后进入百度音乐(music.baidu.com/fm)界面, 点击歌手,播放一首歌,必现报错。
F/libc (): Fatal signal (SIGBUS) at 0x00000007 (code=), thread (android.browser)
......
I/DEBUG ( 232): backtrace:
I/DEBUG ( 232): #00 pc 0016f2ac /system/lib/libwebcore.so
I/DEBUG ( 232): #01 pc 0016f3a9 /system/lib/libwebcore.so
I/DEBUG ( 232): #02 pc 0016f3cd /system/lib/libwebcore.so
I/DEBUG ( 232): #03 pc 0016f4ad /system/lib/libwebcore.so
......
需要定位libwebcore.so出现crash的代码位置。使用命令:ndk-stack -sym <path> [-dump <path>]
注意:要有源码才行。以QRD8926_110202平台为例,需要与手机版本对应的编译完成的源码,
符号表的位置\out\target\product\XXX\symbols\system\lib\
ndk-stack -sym out\target\product\msm8226\symbols\system\lib\ -dump crash.log
********** Crash dump: ********** pid: , tid: , name: android.browser >>> com.android.browser <<<
signal (SIGBUS), code (BUS_ADRALN), fault addr
Stack frame # pc 0016f2ac /system/lib/libwebcore.so: Routine WebCore::operator<(WebCore::TimerHeapElement const&, WebCore::TimerHeapElement const&) at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/Timer.cpp:
Stack frame # pc 0016f3a9 /system/lib/libwebcore.so: Routine void std::__push_heap<WebCore::TimerHeapIterator, int, WebCore::TimerHeapElement>(WebCore::TimerHeapIterator, int, int, WebCore::TimerHeapElement) at QRD8926_110202/LINUX/android/external/stlport/stlport/stl/_heap.c: (discriminator )
Stack frame # pc 0016f3cd /system/lib/libwebcore.so: Routine __push_heap_aux<WebCore::TimerHeapIterator, int, WebCore::TimerHeapElement> at QRD8926_110202/LINUX/android/external/stlport/stlport/stl/_heap.c:
Stack frame # pc 0016f4ad /system/lib/libwebcore.so: Routine WebCore::TimerBase::heapPop() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/Timer.cpp:
Stack frame # pc 0016f587 /system/lib/libwebcore.so: Routine WebCore::TimerBase::heapDelete() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/Timer.cpp:
Stack frame # pc /system/lib/libwebcore.so: Routine WebCore::HTMLMediaElement::updatePlayState() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/html/HTMLMediaElement.cpp:
Stack frame # pc 00125ad3 /system/lib/libwebcore.so: Routine WebCore::HTMLMediaElement::mediaPlayerPlaybackStateChanged(WebCore::MediaPlayer*) at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/html/HTMLMediaElement.cpp:
Stack frame # pc 00178f23 /system/lib/libwebcore.so: Routine WebCore::MediaPlayer::playbackStateChanged() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/graphics/MediaPlayer.cpp:
Stack frame # pc 00263d87 /system/lib/libwebcore.so: Routine WebCore::MediaPlayerPrivate::pause() at QRD8926_110202/LINUX/android/external/webkit/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp:
Stack frame # pc 00178c97 /system/lib/libwebcore.so: Routine WebCore::MediaPlayer::pause() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/graphics/MediaPlayer.cpp:
Stack frame # pc /system/lib/libwebcore.so: Routine WebCore::HTMLMediaElement::updatePlayState() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/html/HTMLMediaElement.cpp:
Stack frame # pc 00124df5 /system/lib/libwebcore.so: Routine WebCore::HTMLMediaElement::mediaPlayerTimeChanged(WebCore::MediaPlayer*) at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/html/HTMLMediaElement.cpp:
Stack frame # pc 00178ef3 /system/lib/libwebcore.so: Routine WebCore::MediaPlayer::timeChanged() at QRD8926_110202/LINUX/android/external/webkit/Source/WebCore/platform/graphics/MediaPlayer.cpp:
Stack frame # pc 00263fad /system/lib/libwebcore.so: Routine WebCore::MediaPlayerPrivate::onEnded() at QRD8926_110202/LINUX/android/external/webkit/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp:
Stack frame # pc 000203cc /system/lib/libdvm.so (dvmPlatformInvoke+): Routine dvmPlatformInvoke at QRD8926_110202/LINUX/android/dalvik/vm/arch/arm/CallEABI.S:
Stack frame # pc 00050d8f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+): Routine dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*) at QRD8926_110202/LINUX/android/dalvik/vm/Jni.cpp:
Stack frame # pc /system/lib/libdvm.so: Routine dalvik_mterp at QRD8926_110202/LINUX/android/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:
Stack frame # pc 0002e218 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+): Routine dvmInterpret(Thread*, Method const*, JValue*) at QRD8926_110202/LINUX/android/dalvik/vm/interp/Interp.cpp:
Stack frame # pc 000630a7 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+): Routine dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool) at QRD8926_110202/LINUX/android/dalvik/vm/interp/Stack.cpp:
Stack frame # pc 0006accb /system/lib/libdvm.so: Routine Dalvik_java_lang_reflect_Method_invokeNative at QRD8926_110202/LINUX/android/dalvik/vm/native/java_lang_reflect_Method.cpp:
Stack frame # pc /system/lib/libdvm.so: Routine dalvik_mterp at QRD8926_110202/LINUX/android/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:
Stack frame # pc 0002e218 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+): Routine dvmInterpret(Thread*, Method const*, JValue*) at QRD8926_110202/LINUX/android/dalvik/vm/interp/Interp.cpp:
Stack frame # pc 00062de9 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+): Routine dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list) at QRD8926_110202/LINUX/android/dalvik/vm/interp/Stack.cpp:
Stack frame # pc 0004c973 /system/lib/libdvm.so: Routine CallStaticVoidMethodV at QRD8926_110202/LINUX/android/dalvik/vm/Jni.cpp:
Stack frame # pc 0004ee0b /system/lib/libandroid_runtime.so: Routine _JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...) at QRD8926_110202/LINUX/android/libnativehelper/include/nativehelper/jni.h:
Stack frame # pc 0004fa9b /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+): Routine android::AndroidRuntime::start(char const*, char const*) at QRD8926_110202/LINUX/android/frameworks/base/core/jni/AndroidRuntime.cpp:
Stack frame # pc 0000105b /system/bin/app_process
Stack frame # pc 0000dcf7 /system/lib/libc.so (__libc_init+): Routine __libc_init at QRD8926_110202/LINUX/android/bionic/libc/bionic/libc_init_dynamic.cpp:
Stack frame # pc 00000d7c /system/bin/app_process
Android NDK定位.so文件crash代码位置的更多相关文章
- FastMM 定位内存泄露的代码位置
FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在 ...
- android NDK的下载-文件太大
需要FQ,建议使用VPN,下载前准备点时间配置网络环境.我的百度网盘好像有~~不过忘记地址了,改天共享,或者私聊我. 2015.4 Android 5.1 Android Studio https:/ ...
- android NDK 生成so 文件流程-ecplice
1:生成jni目录 首先说一句网上,大部分博客这么写的:打开控制台,进入项目目录,运行javah -classpath bin/classes -d jni com.example.hellojni. ...
- Android NDK编译本地文件以及引用第三方so文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS :=-llog LOCAL_MODULE := DeviceAPI LO ...
- eclipse里配置Android ndk环境,用eclipse编译.so文件
做Android NDK开发时,c代码需要用ndk-build来进行编译,而java代码则需要用Android sdk编译. 编译c代码有两种方法: 一.写好c代码后,然后用cygwin搭建ndk-b ...
- 下面就介绍下Android NDK的入门学习过程(转)
为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- 01 android ndk入门实例之android.mk编译
前言 1 环境 android studio2.3 , window系统 2 ndk https://dl.google.com/android/repository/android-ndk-r16- ...
- Android NDK开发Crash错误定位[转]
使用 ndk-stack 的时候需要你的 lib 编译为 debug版的,通常需要下面的修改: 1. 修改 android.mk,增加,为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 ap ...
随机推荐
- 第一次登录mysql,使用任何命令都报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
问题: 使用临时密码登录成功后,使用任何myql命令,例如show databases;都提示下面的报错 ERROR 1820 (HY000): You must reset your passwor ...
- tabindex 去掉虚线
参考 https://bbs.csdn.net/topics/390165247 style="outline: none"
- mock.js 劫持 ajax,模拟数据
http://mockjs.com/ Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. ...
- centos 6 KVM 网卡桥接配置
一. 网卡桥接前准备 1.软件支持: # rpm -qa bridge-utils # yum install bridge-utils 确保软件包已安装 2. 关闭NetworkMana ...
- 1. Two Sum (快速排序;有序数组的查找: 两个指针; 哈希表)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Shell教程 之echo命令
1.显示普通字符串 这里的双引号完全可以省略,以下命令效果一致: echo "传递参数实例!" echo 传递参数实例! 2.显示转义字符 echo "\"传递 ...
- C语言之栈区、堆区
一 局部变量存放在栈区中,函数调用结束后释放内存空间. #include "stdio.h"; #include "stdlib.h"; int *getNum ...
- CountDownLatch的和CyclicBarrier使用
CyclicBarrier的使用: 假设只有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待. CountDownLacth使用: 他经常用于监 ...
- 关于gcc、make和CMake的区别
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要 ...
- Django使用jsonp和cors解决跨域请求问题
1.使用jsonp的方式解决跨域请求的问题 我启动两个django项目,然后使用的端口不一样,在项目1中通过ajax发请求给项目2,然后接受项目2发送过来的数据 先看项目1的ajax的代码 $(&qu ...