Android 打印调用栈的方法

本文介绍了在Java层如何使用Log.getStackTraceString(newThrowable())打印本地调用堆栈,以及通过Binder.getCallingPid()获取并打印远程调用栈。在C层,利用backtrace和backtrace_symbols函数进行调用栈的抓取和打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Java层调用栈打印:

(1)打印本地调用堆栈

Log.i(TAG,  Log.getStackTraceString(new Throwable())); //打印本地调用堆栈

(2)打印远程调用堆栈

import android.os.Binder;import android.app.IActivityManager;import android.util.Log;
String processName = "";
int pid = Binder.getCallingPid();  //打印远程调用栈
//ActivityManager activityManager = (ActivityManager) ServiceManager.getService(Context.ACTIVITY_SERVICE);
try {
    final IActivityManager am = ActivityManager.getService();
    if (am != null) {
        List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();        
        for (ActivityManager.RunningAppProcessInfo info : list) {            
            if (info.pid == pid) {               
             
                processName = info.processName;  //打印调用接口的进程名             
                break;            
            }        
        }
    }
} catch (RemoteException e) {
    Log.i(TAG, "peace error in getService", e);
}

2.C层调用栈打印方法

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/*
u8TraceSize : the size of backtrace you want to dump
*/
void FPP_PrintTrace (int u8TraceSize)
{
  void *btArray[u8TraceSize];
  size_t btSize;
  char **strings;
  size_t i;
  btSize = backtrace (btArray, u8TraceSize);
  strings = backtrace_symbols (btArray, btSize);
  printf ("SetVideoMute begin\n");
  for (i = 0; i < btSize; i++)
  {
    printf ("SetVideoMute #%d:%s\n", i,strings[i]);
  }
  printf ("SetVideoMute end\n");
  free (strings);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值