ChunelFeng / CGraph

【A common used C++ DAG framework】 一个通用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star & fork & 交流
http://www.chunel.cn
MIT License
1.77k stars 322 forks source link

提供一些好用的 debug功能 #332

Closed ChunelFeng closed 2 months ago

ceykmc commented 3 months ago

请问有机制,可以让节点单步执行吗? 类似于调试的时候,在收到信号后,再执行下一个节点,执行完成后,继续等待后续节点执行的信号。

ChunelFeng commented 3 months ago

你好,关于您提到的这个问题。

是这样的,色图中,如果您想调试单个node逻辑,但缺少某些必要条件(比如,特定参数值), 可以简单的通过 外部修改 GParam 值,再注册 单个node 并执行,

即可达到您说的node 单步执行的效果。

ceykmc commented 2 months ago

我是想调试整个pipeline的逻辑的。 我现在尝试的方法是,在调试状态下,给每个node增加一个切面,增加一个全局变量paused。 当运行到指定节点时,在切面中设置paused为true,增加一个等待的信号量。 当外部发送继续运行信号后,外部将paused设置为false。 类似于这样:

class InoDebugAspect : public CGraph::GAspect {
    CStatus beginRun() override
    {
        bool paused = false;
        if (this->getName() == "specified_node_name") {
            fmt::print("paused...\n"); 
            paused = true;
        }
        {
            std::mutex mutex;
            std::condition_variable cv;
            std::unique_lock<std::mutex> lock(mutex);
            cv.wait(lock, [&paused] { return !paused; });
        }
        return CStatus();
    }
};
ceykmc commented 2 months ago

刚发现和这个问题重复了。。。 https://github.com/ChunelFeng/CGraph/issues/45

ChunelFeng commented 2 months ago

新版本中,可以尝试通过 registerGNode 方法,注册一个节点, 并且在外部,人为将 GParam的值,修改为你需要的,然后直接运行 node的 run 方法,进行调试。


  auto node = pipeline->registerGNode<MyWriteParamNode>();
  auto param = pipeline->getGParamWithNoEmpty<MyParam>("key");
  param->iCount = 10;    // 在这里,把参数修改为需要的值,而不需要修改 node内部的逻辑

  node->run();    // 运行 node的 run 方法

如果对项目感兴趣,欢迎添加我的个人微信(ChunelFeng),以便随时交流联系