调用栈打印

非android平台的用户空间C 调用栈打印,因为android 平台使用的是bionic,不是glibc,所以android 平台不能使用:

#include <execinfo.h>

int MAX_CALLSTACK_DEPTH = 32;
void *traceback[MAX_CALLSTACK_DEPTH];
int depth = backtrace(traceback, MAX_CALLSTACK_DEPTH);
int i = 0;
char **stackinfo_string = backtrace_symbols(traceback,depth);
for (i = 0; i < depth; i++){

printf("cyx %p  %s \n\r", traceback[i],stackinfo_string[i]);
}

 

下面转载自 https://blog.csdn.net/u010164190/article/details/78674905

android平台

 

  1. 1.Java中:  
  2. Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));  
  3. Log.d("dump","xxxxxxxxxxxxxxxx",new Throwable());
  4.  
  5. 2.C++中:  
  6.  <1>.test.cpp  
  7.   #include <utils/Log.h>  
  8.   #include <utils/CallStack.h>  
  9.   void dumping_callstack(){  
  10.    android::CallStack stack;  
  11.    //getpid()和gettid()效果一样  
  12.    //stack.update(2,getpid());  
  13.    //stack.update(2,gettid());  
  14.    
  15.   stack.update();  
  16.   //输出到printf  
  17.   stack.dump(1);  
  18.   //输出到logcat  
  19.   stack.log("dump_test");  
  20.   //可以设置第2、3个参数  
  21.   //stack.log("Dumping Stack",ANDROID_LOG_ERROR ,"123 ");  
  22. }  
  23.   
  24. void func1(){  
  25.   dumping_callstack();  
  26. }  
  27.   
  28. void func2(){  
  29.   
  30.   func1();  
  31. }  
  32.   
  33. void func3(){  
  34.   
  35.   func2();  
  36. }  
  37. int main(){  
  38.   ALOGE("main_test------------------>");  
  39.   
  40.   func3();  
  41. }  
  42.   
  43.  <2>.Android.mk  
  44.   LOCAL_PATH := $(call my-dir)  
  45.   include $(CLEAR_VARS)  
  46.   LOCAL_SRC_FILES :test.cpp  
  47.   LOCAL_MODULE_TAGS :optional  
  48.   LOCAL_MODULE :test  
  49.   LOCAL_SHARED_LIBRARIES += libcutils libutils  
  50.   include $(BUILD_EXECUTABLE)  
  51.   
  52. 3.C中:  
  53.  <1>.创建callstack.cpp  或者直接在system/core/libutils/CallStack.cpp 里添加定义
  54.    #include <utils/CallStack.h>  
  55.    extern "C" void dumping_callstack();  
  56.    void dumping_callstack(){  
  57.       android::CallStack stack;  
  58.       stack.update();  
  59.       stack.log(“dump_test“);  
  60.    }  
  61.    namespace android {   。。。。
  62.   <2>.创建callstack.h      //这一步可省略, 调用的地方直接 extern void dumping_callstack();即可  
  63.       void dumping_callstack();  
  64.   <3>.测试test.c  
  65.       #include "callstack.h"  
  66.   
  67.       static ssize_t out_write(){  
  68.         dumping_callstack();  
  69.       }  
  70.   <4>.Anroid.mk中添加到编译选项:callstack.cpp及库  
  71.       LOCAL_SHARED_LIBRARIES :libcutils libutils  
  72.       LOCAL_SRC_FILES :callstack.cpp  
  73.   
  74. 4.Kernel中:  
  75. #include <asm/ptrace.h>  
  76. printk(KERN_ERR "dump_stack start: %s() %d \n",__FUNCTION__,__LINE__);    
  77.   
  78. dump_stack();  
  79. .......  
  80. printk(KERN_ERR "dump_stack stop: %s() %d \n",__FUNCTION__,__LINE__);    
  81. 根据dump stack的log位置加printk()。  
  82.   
  83. 测试:  
  84. # adb logcat | grep dump_test  

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值