HarmonyOS 鸿蒙Next Debug下如何打印调用栈

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Debug下如何打印调用栈

在断点情况下, 如果查看或打印调用栈, 比如断点在方法D上, 想要打印出哪个方法调用了方法D, 依次类推, 直至到第一个方法.

2 回复

可使用new Error().stack获取方法的调用堆栈信息,或使用console.trace打印当前堆栈 console.trace:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-logs-V5#consoletrace10

修改根目录->hvigor->hvigor-config.json5中的日志级别logging->level为debug级别,同时修改stacktrace->true,Debug报错日志会启用打印堆栈跟踪:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-hvigor-set-options-V5

demo如下:

@Entry

@Component

struct Index {

  @State message: string = 'Hello World';

  testA(){

    this.testB()

  }

  testB(){

    this.testC()

  }

  testC(){

    this.testD()

  }

  testD(){

    console.trace('testD')

  }

  build() {

    RelativeContainer() {

      Text(this.message)

        .id('HelloWorld')

        .fontSize(50)

        .fontWeight(FontWeight.Bold)

        .alignRules({

          center: { anchor: '__container__', align: VerticalAlign.Center },

          middle: { anchor: '__container__', align: HorizontalAlign.Center }

        })

        .onClick(()=>{

          this.testA()

        })

    }

    .height('100%')

    .width('100%')

  }

}

打印结果是:

Trace: testD

  at testD (entry/src/main/ets/pages/Index.ets:16:5)      

  at testC (entry/src/main/ets/pages/Index.ets:13:5)

  at testB (entry/src/main/ets/pages/Index.ets:10:5)

  at testA (entry/src/main/ets/pages/Index.ets:7:5)

  at anonymous (entry/src/main/ets/pages/Index.ets:30:11)

更多关于HarmonyOS 鸿蒙Next Debug下如何打印调用栈的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next Debug下打印调用栈,可以通过以下步骤实现:

  1. 使用Log工具:鸿蒙系统提供了日志打印工具,如HILOG。你可以使用它来打印调用栈信息。具体地,可以调用HiLog的接口,设置合适的日志级别(如ERROR)和标签,然后将调用栈信息作为日志内容输出。

  2. 获取当前线程调用栈:鸿蒙系统提供了获取当前线程调用栈的API,通常这些API会返回一个字符串或字符串数组,表示从当前函数到调用它的函数链条。你可以通过调用这些API来获取调用栈信息。

  3. 组合使用:在调试过程中,当遇到需要打印调用栈的场景时,先获取当前线程的调用栈信息,然后使用日志工具将其输出。

  4. 示例代码

    #include <hilog/log.h>
    #include <stack_trace.h>  // 假设这是鸿蒙提供的获取调用栈的头文件
    
    void PrintCurrentStackTrace() {
        char* stackTrace = GetCurrentStackTrace();  // 假设这是获取调用栈的函数
        HiLog::Error("TAG", "Current stack trace: %s", stackTrace);
        // 释放stackTrace资源,如果有必要的话
    }
    

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部