普法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