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

本文介绍了Android Java程序调用kernel32的方法,以及在Android和Linux Kernel中打印调用栈的多种技巧,包括使用Trace、Log、CallStack等。同时提到了kernel中调用dump_stack()函数来打印内核栈。
摘要由CSDN通过智能技术生成

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 // 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

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 //include头文件一定要放在.cpp头部,不要放在namespace android { } 里面,否则报CallStack 未定义的错误。

链接库 libutils 动态库。

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

调用函数dump_stack()即可打出内核栈。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值