(android 源码下开发应用程序) 如何在 Android 各 level ( 包含 user space 與 kernel space ) 使用dump call stack的方法
http://janbarry0914.blogspot.com/2014/07/androiddump-call-stack.html
dump call stack
[文章重點]
- kernel call stack
- Android Java layer
- Android framework ( written by c++)
- Android HAL ( written by c )
- Call Stack 沒有出現 function name
kernel call stack
|
void func_foo(void){
int a=3; ... dump_stack(); ... } |
Java layer call stack
|
public void foo(boolean state, int flags) {
... Log.d(TAG,"xxxx", new Throwable()); ... } |
C++ layer call stack
|
#include <utils/CallStack.h>
... void foo(void) { ... android::CallStack stack; stack.update(); stack.dump("XXX"); ... |
|
#include <utils/CallStack.h>
... void foo(void) { ... android::CallStack stack; stack.update( ); stack.log("XXX"); ... |
|
LOCAL_SHARED_LIBRARIES += libutils
|
C layer call stack
|
#ifdef __cplusplus
extern "C" { #endif void dump_stack_android(void); |
|
#include "dump_stack.h"
#include <utils/CallStack.h> using namespace android; |
|
#include "dump_stack.h"
#include <utils/CallStack.h> using namespace android; |
|
LOCAL_SRC_FILES := \
…... \ dump_stack.cpp LOCAL_SHARED_LIBRARIES += libutils |
|
extern void dump_stack_android();
void function_a() |
有時我們會發現在C++ 或 C 語言中使用 CallStack , 在 call dump 中並沒有出現 function name
|
D/XXX ( 147): #00 pc 00001b90 /system/lib/hw/audio.primary.mrvl.so (dump_stack_android+19)
D/XXX ( 147): #01 pc 00004b56 /system/lib/hw/audio.primary.mrvl.so
D/XXX ( 147): #02 pc 0001f828 /system/lib/libaudioflinger.so
D/XXX ( 147): #03 pc 00019138 /system/lib/libaudioflinger.so
D/XXX ( 147): #04 pc 00023bb6 /system/lib/libaudioflinger.so
D/XXX ( 147): #05 pc 0000e9fe /system/lib/libutils.so (android::Thread::_threadLoop(void*)+213)
D/XXX ( 147): #06 pc 0000e530 /system/lib/libutils.so
D/XXX ( 147): #07 pc 0000d208 /system/lib/libc.so (__thread_entry+72)
D/XXX ( 147): #08 pc 0000d3a4 /system/lib/libc.so (pthread_create+240)
|
我們追一下 CallStack 是如何被實作
先回顧一下 CallStack 是如何被使用 (以 Android 4.4 為例)
CallStack stack;
stack.update();
stack.log();
先看一下 update( ) function 的定義 ( it is under system/core/include/utils/CallStack.h)
// Immediately collect the stack traces for the specified thread.
void update(int32_t ignoreDepth=1, int32_t maxDepth=MAX_DEPTH, pid_t tid=CURRENT_THREAD);
所以透過 update( ) function, 我們可以設定想看哪一個 thread 並 dump 出多少層的 call stack, 如果都沒寫, 就是以當前的 thread 去做 call stack dump, update( ) function 會將實際可以 dump 多少的 frame 給抓出來, 其中 frame 的數量記錄在 mCount 變數, 各 frame 的資訊則記錄在 mStack[ ] 裡面, 接下來再透過 log( ) function 把 call stack 裡的 program counter 所記載的記憶體位址去把相對應的 function name 給解析出來.
log( )
|--> print( )
|--> get_backtrace_symbols( )
看一下 get_backtrace_symbols( ) 在做些什麼
|
void get_backtrace_symbols(const backtrace_frame_t* backtrace, size_t frames,
backtrace_symbol_t* backtrace_symbols) {
...
for (size_t i = 0; i < frames; i++) {
...
Dl_info info;
if (dladdr((const void*)frame->absolute_pc, &info) && info.dli_sname) {
symbol->relative_symbol_addr = (uintptr_t)info.dli_saddr
- (uintptr_t)info.dli_fbase;
symbol->symbol_name = strdup(info.dli_sname);
symbol->demangled_name =
demangle_symbol_name(symbol->symbol_name);
}
...
}
release_my_map_info_list(milist);
}
|
(android 源码下开发应用程序) 如何在 Android 各 level ( 包含 user space 與 kernel space ) 使用dump call stack的方法的更多相关文章
- 在Android源码下编译jni所需要知道的事~
以下只是自己的一些总结,欢迎讨论 通过NDK编译jni网上有很多例子,在这我只总结在Android源码下编译 1.android源码环境下编译so包,编出来的.so的包前面不会自动给添加lib,NDK ...
- 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)
原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...
- Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果
一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...
- Android源码下编译APK步骤
1.进入android源码目录下的build下执行:source envsetup.sh 后继续在该路径下执行lunch. 2.编写完成工程 3.编写Android.mk文件,放入工程目录下 ...
- S5P4418开发板android源码下uboot和内核缺省文件的配置
uboot 需要配置缺省文件,进入解压的源码目录 android,然后进入 u-boot 目录,如下图所示.如上图所示,如果是 1G 核心板,则使用“cp nsih-1G16b-4418.txt ns ...
- Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关
一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...
- 【转】模块编译Android源码方法
原文网址:http://blog.csdn.net/androidlover1991/article/details/17014055 实际开发中,并不需要每次都编译所有源代码,只需要编译自己修改的模 ...
- Android源码解析系列
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
- Android源码分析(八)-----系统启动流程&IPC简述
一 :系统启动流程图 从下往上依次启动linux kernel -->zygote-->SystemServer-->NativeService-->AndroidServic ...
随机推荐
- python 脚本
mag3.py 1,import import sys from org.eclipse.jface.dialogs import MessageDialogfrom org.eclipse.core ...
- Spring MVC常用的注解
@Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为 类名称开头字母小写,你也可以自己指定,如下 方法一: @Controller ...
- 判断触摸的点在那个 View上
UIView *touched = [self.view hitTest:pt withEvent:event]; Uiview *touchView = [pt view];
- jquery , find the event handler,找到jquery中的event handler
找到 dispatch: function (e) { e = b.event.fix(e); var n, r, i, s, o, u = [], a = d.call(arguments), f ...
- 想使用 MongoDB ,你应该了解这8个方面!
应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系数据库和非关 ...
- android 案例:从另一个activity选择信息并获取返回值
主窗口: package com.example.test; import android.app.Activity; import android.app.AlertDialog; import a ...
- 使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘(引)
使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘 由于帮人在MacBook上装Windows, 用pe格式化了一下分出来的Windows分区, 搞得Mac系统也瘫掉了, 无奈之下 ...
- ANDROID_MARS学习笔记_S01原始版_019_SERVICE之Transact
一.代码1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/ ...
- 133. Clone Graph
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- 【HDOJ】3652 B-number
终于自己写出来一道数位DP啊.继续训练DP. /* 3652 */ #include <iostream> #include <sstream> #include <st ...