關(guān)于android java打出調(diào)用棧的方法
成都創(chuàng)新互聯(lián)公司始終致力于在企業(yè)網(wǎng)站建設(shè)領(lǐng)域發(fā)展。秉承“創(chuàng)新、求實(shí)、誠信、拼搏”的企業(yè)精神,致力為企業(yè)提供全面的網(wǎng)絡(luò)宣傳與技術(shù)應(yīng)用整體策劃方案,為企業(yè)提供包括“網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、微信網(wǎng)站建設(shè)、重慶小程序開發(fā)、商城網(wǎng)站建設(shè)、平臺網(wǎng)站建設(shè)秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
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)方法四:
運(yùn)行時(shí)堆棧打印:【debuggerd的堆棧dump】
debuggerd -b
輸出:
/data/tombstone/
android打印出native棧的方法
1)舊版本android的方法:
頭文件:
#include
在 Android.mk 中還需要加入:
LOCAL_SHARED_LIBRARIES += libcorkscrew
實(shí)現(xiàn):
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
進(jìn)程號,可以用ProcessCallStack.cpp
使用的例子很簡單。例如
RefBase.cpp
中
直接調(diào)用
CallStack stack(“字符串”);
即可打印出棧。
#include
鏈接庫 libutils 動態(tài)庫。
kernel和驅(qū)動打印調(diào)用棧的方法
調(diào)用函數(shù)dump_stack()即可打出內(nèi)核棧。
但此刻的用戶棧不會打出來,如果需要此刻的用戶棧,只能觸發(fā)crash后,用crash工具和gdb工具來看進(jìn)程的內(nèi)核棧和用戶棧。
另外我的相關(guān)培訓(xùn)視頻請看:
歡迎觀看我發(fā)布的各個(gè)課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費(fèi)的linux各種驅(qū)動開發(fā)課程如下:
https://edu.51cto.com/course/17138.html
我的新的更多優(yōu)惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4