Android Native层函数调用堆栈打印通用方法

Android为方便Native层打印函数的调用堆栈,专门在system/core/libutils下设计了CallStack.cpp类
如果需要打印Native的stack只需要在自己的代码的mk文件中添加对libutils.so添加依赖,在类文件中include <utils/CallStack.h> 头文件。

实现方法如下:

.cpp文件
include <utils/CallStack.h>

CallStack stack("powered by gaojian");

该过程还需要在编译文件添加对libutils.so的依赖,如下:

Android.mk
LOCAL_SHARED_LIBRARIES += libutils

该方案的缺点:

  1. 需要修改编译问题,存在依赖libutils不成功的情况
  2. 只能在cpp文件中使用,无法在.c文件中使用

为解决该问题,本人百度、google研究了个遍,各种攻略都以失败告终,自己也相当郁闷,
难道就没有一个简单通用方法在c/c++文件中打印堆栈吗?
答案是肯定的

自己去研究了下CallStack .cpp,突发灵感,只要稍微对CallStack .cpp做修改,即可搞定这个问题!!!!

上代码:

修改system/core/libutils/CallStack.cpp代码

new mode 100755
diff --git a/system/core/libutils/CallStack.cpp b/system/core/libutils/CallStack.cpp
old mode 100644
new mode 100755
index bd6015e..f8eb620
--- a/system/core/libutils/CallStack.cpp
+++ b/system/core/libutils/CallStack.cpp
@@ -26,6 +26,11 @@
 
#include <backtrace/Backtrace.h>
 
+extern "C" void call_stack_fun()
+{
+	android::CallStack stack("powered by gaojian"); 
+}
 namespace android {
 
 CallStack::CallStack() {
@@ -33,7 +38,7 @@ CallStack::CallStack() {
 
 CallStack::CallStack(const char* logtag, int32_t ignoreDepth) {
     this->update(ignoreDepth+1);
     this->log(logtag);

 }

编译出libutils.so,重命名为libutilscallstack.so(当然也可以不重命名,主要是怕和原so冲突)

然后在想打印trace的C或者C++方法中通过 dlopendlsym方法去调用该方法,代码如下

 #include <cutils/properties.h>
 #include "camxchinode.h"
+#include <dlfcn.h>
+typedef void(*func_call_stack_t) ();
 
@@ -522,6 +524,11 @@ VOID ChiFBNode::CheckBokehParams(CHINODEPROCESSREQUESTINFO* pProcessRequestInfo)
 CDKResult ChiNode::ProcessRequest(CHINODEPROCESSREQUESTINFO* pProcessRequestInfo)
 {
+    void*  prt_stack_lib = dlopen("/system/lib/libutilscallstack.so", RTLD_LAZY);
+    func_call_stack_t prt_stack_fun = (func_call_stack_t)(dlsym(prt_stack_lib, "call_stack_fun"));
+    prt_stack_fun();
+    dlclose(prt_stack_lib);
     BOOL statisfied = CheckDependency(pProcessRequestInfo);

bingo!!!

分享下这个成果,如果觉得有用,麻烦帮点个赞,哈哈。。。请叫我雷锋

猜你喜欢

转载自blog.csdn.net/u010116586/article/details/91486568