android native HAL程序 java程序 linux kernel打印调用栈的方法

android native HAL程序 java程序 linux kernel打印调用栈的方法

关于android java打出调用栈的方法

1)方法一:
refs:frameworks/base/services/java/com/android/server/ActivityManagerService.java
startProcessLocked()
{
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, “amProcessStart”); /// M: Add for LCA launch time debug

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); /// M: Add for LCA launch time debug
}

2)方法二:
catch (RemoteException e) {
e.printStackTrace();

}

3)方法三:
Log.d(TAG,Log.getStackTraceString(new Throwable()));

需要在java中
import android.util.Log;
import android.util.Slog;

4)方法四:
运行时堆栈打印:【debuggerd的堆栈dump】
debuggerd -b
输出:
/data/tombstone/

android打印出native栈的方法

1)旧版本android的方法:
头文件:
#include <corkscrew/backtrace.h> // system/core/include/corkscrew/backtrace.h

在 Android.mk 中还需要加入:
LOCAL_SHARED_LIBRARIES += libcorkscrew

实现:
void AudioMachineDevice::Dump_Backtrace(char* logtag, int32_t ignoreDepth, int32_t maxDepth) {
static const int MAX_DEPTH = 31;
static const int MAX_BACKTRACE_LINE_LENGTH = 800;
size_t i = 0;

if (maxDepth > MAX_DEPTH) {
maxDepth = MAX_DEPTH;
}
backtrace_frame_t mStack[MAX_DEPTH];
ssize_t count = unwind_backtrace(mStack, ignoreDepth + 1, maxDepth);
if (count <= 0) {
ALOGW("Can not get stack trace");
return;
}

backtrace_symbol_t symbols[count];

get_backtrace_symbols(mStack, count, symbols);
for (i = 0; i < count; i++) {
char line[MAX_BACKTRACE_LINE_LENGTH];
format_backtrace_line(i, &mStack[i], &symbols[i],
line, MAX_BACKTRACE_LINE_LENGTH);
ALOGD("AudioMachineDevice::AnalogOpen %s%s", "", line);
}
free_backtrace_symbols(symbols, count);
}
此方法===========新版本不能用, android KK版本能用。

2)方法二:
C++堆栈:【libutils.so】【backtrace】【c++】
include <utils/CallStack.h>

CallStack stack;
stack.update();
stack.dump();
此方法===========新版本不能用

3)方法三,参考debuggerd的方法。或者直接用debuggerd来打印栈。
参见代码/system/core/debuggerd/
backtrace.cpp
debuggerd.cpp
tombstone.cpp

4)方法四,新版本android L,用
/system/core/libutils/CallStack.cpp 和头文件 CallStack.h
进程号,可以用ProcessCallStack.cpp

使用的例子很简单。例如
RefBase.cpp

直接调用
CallStack stack(“字符串”);
即可打印出栈。

#include <utils/CallStack.h> //include头文件一定要放在.cpp头部,不要放在namespace android { } 里面,否则报CallStack 未定义的错误。

链接库 libutils 动态库。

kernel和驱动打印调用栈的方法

调用函数dump_stack()即可打出内核栈。
但此刻的用户栈不会打出来,如果需要此刻的用户栈,只能触发crash后,用crash工具和gdb工具来看进程的内核栈和用户栈。

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

原文地址:https://blog.51cto.com/8906847/2367904

时间: 2024-10-25 10:40:39

android native HAL程序 java程序 linux kernel打印调用栈的方法的相关文章

在c或c+程序里打印调用栈。转

在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好不过了.本文介绍和调用椎栈相关的几个函数. NAME       backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging SYNOPSIS

Android各种获取代码调用栈的方法[补]

打印调用栈不用说,基本上每位开发者都会用到,讨论几个方法,以前也说过,http://blog.csdn.net/freshui/article/details/9456889 再次简单整理一下吧,啰嗦就啰嗦了 :) 基本分两大类,一类是静态的,要把打印语句插入到代码中,一类是动态的,需要看的时候,查看一下,实时观测各线程调用栈情况. 静态方法 1. Java中打印调用栈 比较简单,利用Throwable,直接log中打印出来: [java] view plain copy Log.d(TAG, 

[daily] 查看linux程序或操作的kernel内核调用栈

一 [classic_tong @ https://www.cnblogs.com/hugetong/p/12198122.html] 查看一个命令或程序,都调用了什么系统API的方法, 可以是用strace [[email protected] OUTPUT_nginx]# strace echo execve("/usr/bin/echo", ["echo"], [/* 22 vars */]) = 0 brk(NULL) = 0x1311000 mmap(NU

frida hook java原生算法同时打印调用堆栈

# -*- coding: UTF-8 -*- import frida, sys jsCode = """ function showStacks() { Java.perform(function () { send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new())); }); } (function ()

android 初识socket通信--java程序做服务器

1.新建一个java工程做服务器 public class MyServer { String str ; public MyServer(){ try { //服务器端的声明用serversocket,括号里面写端口号,端口号是自己指定的 ServerSocket ss = new ServerSocket(4700); //accept方法在这里会一直等待客户端连接进来 Socket accept = ss.accept(); //新建一个读入流,字符集是utf-8 BufferedRead

Java反射支持通过invoke调用得到的方法

我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得到Class对象.在JDK中提供了两种方式得到Class对象. 我们能收发数据的一个重要原因是redis服务器的实现是单线程的,为此,twemproxy的实现也是单线程的. 倘若user中的name.age属性变化,如何知道它们变化了呢? 今儿 http://www.cnblogs.com/egb3

java 中打印调用栈

source-code: public class A { public A() {} private static void printStackTrace() {         StackTraceElement[] stackElements = new Throwable().getStackTrace(); if(stackElements != null) { for(int i = 0; i < stackElements.length; i++) { System.out.pr

java反射系列六之调用属性与方法

调用指定属性 package reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestFiled { public static void main(String[] args) throws Exception { TestFiled t = new TestFiled(); t.test3(); } //调用运行时类中的指定的属性 public void test

Java程序员面试题集(1-50)

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja