You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何使用带log_callback回调的enable_log接口获取调试日志

解决方案

1 修正Dummy类模拟实现

首先需要让Dummy类的enable_log接口完全对齐真实类A的定义,你之前报错的核心原因是错把函数指针类型的入参写成了const std::string&,且const引用本身不允许被赋值。
正确的模拟实现代码如下:

#include <string>

// 对齐真实头文件中的回调定义
using log_callback = void (*)(const std::string& message, void* user_data);

class DummyA {
private:
    log_callback m_callback = nullptr;
    void* m_user_data = nullptr;
public:
    // 完全对齐真实接口的enable_log
    void enable_log(log_callback callback, void* user_data = nullptr) {
        m_callback = callback;
        m_user_data = user_data;
    }

    // 模拟类A内部生成日志的逻辑,真实场景下这部分是类A原有代码自带的
    void trigger_log_for_test(const std::string& test_msg) {
        if (m_callback) {
            m_callback(test_msg, m_user_data);
        }
    }
};

2 业务侧调用实现

不需要修改原有类的任何代码,只需要在业务侧自定义回调函数,通过user_data参数传递你在main中声明的字符串指针,即可实现日志内容的捕获:

#include <iostream>

// 自定义回调函数,逻辑完全由业务侧实现
void my_log_handler(const std::string& message, void* user_data) {
    // 将user_data强转为我们传入的字符串指针,写入日志内容
    std::string* output_buf = static_cast<std::string*>(user_data);
    if (output_buf) {
        *output_buf = message;
    }
}

int main() {
    DummyA a;
    // 你要存储日志的空字符串
    std::string log_content;

    // 注册回调,把字符串的指针作为user_data传入
    a.enable_log(my_log_handler, &log_content);

    // 模拟类A内部生成日志的动作,真实场景下这一步是类A运行时自动触发的
    a.trigger_log_for_test("ABCD: 测试诊断日志");

    // 直接输出捕获到的日志
    std::cout << "捕获到的日志:" << log_content << std::endl;

    // 真实场景下你可以直接用这个log_content做后续分析,比如写入崩溃转储的附属日志文件
    return 0;
}

真实项目适配说明

真实Linux环境下的类A不需要做任何修改,你只需要把上述代码中的DummyA替换为你的类A即可:类A内部生成日志时会自动调用你注册的my_log_handler,把诊断日志写入你指定的字符串中,你可以在崩溃前把捕获到的所有日志写入磁盘,辅助定位core dump原因。

内容的提问来源于stack exchange,提问作者csharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:57:04