当前位置: 首页 > news >正文

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈

1.使用CallStack跟踪函数调用

修改涉及三个内容:

  • Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。
  • 代码中包含CallStack的头文件。
  • 代码中调用CallStack接口,打印函数调用栈。

例子:查看Camera3Device::waitUntilStateThenRelock调用链路

1.Camera3Device.cpp中包含utils/CallStack.h头文件

diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index bb54f25..9f30160 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -74,6 +74,7 @@
 #include <algorithm>
 #include <optional>
 #include <tuple>
+#include <utils/CallStack.h>

 using namespace android::camera3;
 using namespace android::camera3::SessionConfigurationUtils;

2.Camera3Device::waitUntilStateThenRelock中打印调用栈

@@ -1654,32 +1661,59 @@ status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout,
             mRequestThread->signalPipelineDrain(streamIds);
             signalPipelineDrain = true;
         }
         mRequestBufferSM.onWaitUntilIdle();
     }

+    {
+        android::String8 backtrace;
+        android::CallStack cs;
+        cs.update();
+        backtrace = cs.toString();
+        ALOGD("chenhy-trace:%s", backtrace.c_str());
+    }
+
     bool stateSeen = false;
     nsecs_t startTime = systemTime();
     do {
         if (mStatus == STATUS_ERROR) {
             // Device in error state. Return right away.

3.Camera3Device.cpp编译时链接libutilscallstack.so

diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index a74b6d6..b58c535 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -233,6 +233,10 @@ cc_library {
         "-Werror",
         "-Wno-ignored-qualifiers",
     ],
+
+    shared_libs: [
+        "libutilscallstack",
+    ],
 }

 cc_library_static {

4.效果

Android15 Frameworks/Native中打印函数调用栈

http://www.dtcms.com/a/94821.html

相关文章:

  • 使用string和string_view(二)——数值转换、std::string_view和非标准字符串
  • 华为、浪潮、华三链路聚合概述
  • 蓝桥杯 第十二天 819 递增序列
  • dubbo自定义扩展
  • Redis常见面试问题汇总
  • 【deepseek 学c++】weakptr引用场景
  • HBase在Hadoop平台上的安装和配置
  • Blender多边形填充问题
  • 00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)
  • Qt弹出新窗口并关闭(一个按钮)
  • Leetcode 四数之和
  • IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题
  • docker中安装 python
  • Go 语言规范学习(3)
  • 5.0 WPF的基础介绍1-Grid,Stack,button
  • 同级目录下的两个文件怎么import
  • ngx_http_core_main_conf_t
  • DeepSeek-R1 模型现已在 AWS 平台上正式上线
  • SSE SseEmitter.completeWithError(e) 触发的处理逻辑
  • 使用 PowerShell 脚本 + FFmpeg 在 Windows 系统中批量计算 MP4视频 文件的总时长
  • (C语言)文本动态通讯录(动态通讯录升级版)(C语言小项目)
  • macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法
  • 使用 rsync 进行服务器文件同步与优化
  • STM32基础教程——输入捕获模式测量PWM频率
  • SD(Stable Diffusion)模型学习图谱
  • 视频生成的测试时Scaling时刻!清华开源Video-T1,无需重新训练让性能飙升
  • 内网YUM源搭建手册(Internal Network yum Source Construction Manual)
  • c++ primer 阅读手记 第六章
  • RCE——回调后门
  • 【ADC测试】在ADC马密度的方式测试INL和DNL