敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述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;
【android native HAL程序 java程序 linux kernel打印调用栈的方法】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
推荐阅读
- 关于读取mapper的两种方式
- 关于android audio路由策略的修改
- Android中关于如何限制上层应用只在特定区间画图
- 关于android各种sensor的思考(Accelerometer,Magnetometer,Gy
- 关于linux input device输入子系统架构及android中的框架
- 关于android使用自己的launcher替换默认launcher的方法
- 用Cubism 2制作自己的Live2D(尝试向)——android sdk样本的下载与Android studio编译!
- Android Studio 常用应用
- create-react-app项目配置