您现在的位置是:首页 >其他 >OpenHarmony下如何打印C/C++调用堆栈网站首页其他

OpenHarmony下如何打印C/C++调用堆栈

IT先森 2024-06-17 10:13:47
简介OpenHarmony下如何打印C/C++调用堆栈

          普法OpenHarmony下如何打印C/C++调用堆栈



引言

  各位大姐,老妹,兄弟是否在OpenHarmony开发移植过程中有过如下烦恼呢?想跟踪源码探寻相关代码逻辑的时候,当面对代码分支逻辑太多,太复杂,打调试信息进行追踪已经没有可能的窘困时候。此时的你是否在黯然神伤,想过放弃呢。没有关系,因为你看到了这篇,从此可以为你打开新世界的大门,增加一种调试手段,那就是OpenHarmony下打印C/C++调用堆栈。学会了此招,虽然不能是您内力突增,但是学习起来辟邪剑谱,九阳真经等上等功夫会精进许多。

其实嘛,这段是废话!各位如果有紧急事情可以直接跳过,进入下一环节!




一.如何引入

前面给朋友们扯了半天,还没有进入正题太不应该了!是时候展示真正的技术了!开搞!


1.1 在BUILD.gn中引入头文件

这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。这个地方必须注意!

  include_dirs = [
    "//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher/include/",
  ]

1.2 在BUILD.gn中引入依赖

这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。这个地方必须注意!

  deps = [
    "//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher:lib_dfx_dump_catcher",
  ]

1.3 在要使用的地方使用

这里的BUILD.gn必须是你需要跟踪堆栈的文件所对应的BUILD.gn中,而不是随便一个。这个地方必须注意!

#include "dfx_dump_catcher.h"
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;



OHOS::HiviewDFX::DfxDumpCatcher dumplog;
std::string msg = "";
bool result = dumplog.DumpCatch(getpid(), gettid(), msg);
if (result) {
    HLOGD("xxx %{public}s", msg.c_str());
}


1.4 具体打印效果

前面扯了这么多疗效是如何如何好,不见得真家伙摆上是不行了。这不上酸菜了。

01-01 00:00:28.030   657   657 D 01400/OHOS::RS: CommitLayers Tid:657 comm:render_service
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #00 pc 000000000004a18c /system/lib64/librender_service.z.so(OHOS::Rosen::RSComposerAdapter::CommitLayers(std::__h::vector<std::__h::shared_ptr<OHOS::Rosen::HdiLayerInfo>, std::__h::allocator<std::__h::shared_ptr<OHOS::Rosen::HdiLayerInfo> > > const&)+124)
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #01 pc 00000000000803a8 /system/lib64/librender_service.z.so(OHOS::Rosen::RSRenderServiceVisitor::ProcessDisplayRenderNode(OHOS::Rosen::RSDisplayRenderNode&)+3816)
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #02 pc 000000000007f100 /system/lib64/librender_service.z.so(OHOS::Rosen::RSRenderServiceVisitor::ProcessBaseRenderNode(OHOS::Rosen::RSBaseRenderNode&)+136)
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #03 pc 0000000000055768 /system/lib64/librender_service.z.so(OHOS::Rosen::RSMainThread::Render()+1568)
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #04 pc 0000000000059ad4 /system/lib64/librender_service.z.so
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #05 pc 000000000000f8fc /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)> const&)+856)
01-01 00:00:28.030   657   657 D 01400/OHOS::RS: #05 pc 000000000000f8fc /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)> const&)+856)



写在最后

到这里,OpenHarmony下如何打印C/C++调用堆栈就告一段落了!。OpenHarmony值路漫漫吾将上下而求索,总之,各位,青山不改绿水长流先到这里了!

在这里插入图片描述

参考
1.FaultLoggerd组件
2.DFX工具HiDumper

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。