如何构建特定函数调用的图表?

2024-04-15

我有一个项目,我想动态构建特定函数调用的图表。例如,如果我有 2 个模板类 A 和 B,其中 A 有一个跟踪方法(保存为图形节点),B 有 3 个方法(非跟踪方法、跟踪方法和调用 A 的跟踪方法的跟踪方法),那么我希望能够仅将跟踪的方法调用注册为图形对象作为节点。图形对象可以是单例。

template <class TA>
class A
{
public:
    void runTracked()
    {
        // do stuff
    }
};

template <class TB>
class B
{
public:
    void runNonTracked()
    {
        // do stuff
    }

    void runTracked()
    {
        // do stuff
    }

    void callATracked()
    {
        auto a = A<TB>();
        a.runTracked();
        // do stuff
    }
};

void root()
{
    auto b1 = B<int>();
    auto b2 = B<double>();
    b1.runTracked();
    b2.runNonTracked();
    b2.callATracked();
    
}

int main()
{
    auto b = B<int>();
    b.runTracked()
    root();
    return 0;
}

这应该输出与以下类似的图形对象:

root()
\-- B<int>::runTracked()
\-- B<double>::callATracked()
    \-- A<double>::runTracked()

跟踪的功能应该是可调的。如果根可以调节(如上面的示例),那将是最好的。 有没有一种简单的方法可以实现这一目标?

我正在考虑引入一个用于跟踪功能的宏和一个将跟踪功能注册为节点的单例图对象。但是,我不确定如何确定调用堆栈中最后一个跟踪的函数,或者(从图形角度来看)当我想添加新节点时,哪个图形节点应该是父节点。


一般来说,你有两种策略:

  1. 使用某种日志记录/跟踪框架来检测您的应用程序,然后尝试复制某种类似于跟踪 mixin 的功能来应用全局/本地跟踪,具体取决于您应用 mixin 的代码部分。

  2. 使用为编译器或运行时启用的某种跟踪检测功能重新编译代码,然后使用关联的跟踪编译器/特定于运行时的工具/框架来转换/筛选数据。

对于 1,这将需要您手动插入更多代码或类似的内容MSVC 的 _penter/_pexit https://stackoverflow.com/questions/23071932/visual-studio-macro-for-penter-and-pexit手动或创建某种范围记录器 https://stackoverflow.com/a/3316446/3819850这将(希望如此!)将异步记录到某些外部文件/流/进程。这不一定是坏事,因为在跟踪进程崩溃的情况下,使用单独的进程控制跟踪跟踪可能会更好。无论如何,您可能必须重构代码,因为 C++ 对于元编程在模块/全局级别重构/检测代码没有提供一流的支持。然而,对于大型应用程序来说,这并不是一种罕见的模式。例如,AWS X射线 https://aws.amazon.com/xray/是商业跟踪服务的一个示例(不过,通常我认为它适合跟踪网络调用和 RPC 调用而不是进程内函数调用的用例)。

对于2,你可以尝试类似的方法utrace https://github.com/namhyung/uftrace或特定于编译器的东西:MSVC 有各种工具,例如性能浏览器 https://learn.microsoft.com/en-us/visualstudio/profiling/how-to-limit-instrumentation-to-specific-functions?view=vs-2017, LLVM 有XRay https://llvm.org/docs/XRay.html, 海湾合作委员会有gprof https://sourceware.org/binutils/docs/gprof/。您本质上是在某种“debug++”模式下进行编译,或者有一些特殊的操作系统/硬件/编译器魔法可以自动插入跟踪指令或标记,帮助运行时跟踪您所需的代码。这些启用跟踪的程序/运行时通常会发出某种唯一的跟踪格式,然后必须由唯一的跟踪格式读取器读取该格式。

最后,在内存中动态构建图也是一个类似的故事。与上面的跟踪策略一样,有多种应用程序和运行时级库可以帮助跟踪您可以通过编程方式与之交互的代码。即使是创建记录到跟踪文件的 ScopedTracer 对象的最简单版本,也可以配备一个消费者线程,该线程拥有并更新跟踪图,满足您所需的任何延迟和数据持久性要求。

Edit:如果您愿意,OpenTelemetry/Jaeger 可能是在提取数据后开始可视化跟踪的好地方(如果需要,您也可以直接向其报告),尽管它更喜欢树表示格式:Jaeger 跟踪详细信息视图文档 https://www.jaegertracing.io/docs/1.41/#trace-detail-view

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建特定函数调用的图表? 的相关文章

随机推荐

  • 使用 jquery 捕获给定元素的所有事件(单击、更改、鼠标悬停等)

    无论如何 我可以检查现有元素是否附加了事件处理程序吗 假设一个简单的javascript方法向某个div example 无jquery 添加了一个点击事件 因此没有属性标签 那么是否可以使用jquery捕获附加的事件 我尝试使用下面的代码
  • 从 Teradata 12 升级到 Teradata 13 后出错....terasso.dll

    我们目前正在将 Teradata 客户端从 v12 升级到 v13 为此 从系统中卸载了旧版 Teradata 12 并安装了 TTU13 安装后 当我尝试使用新的 Teradata 驱动程序添加 ODBC 连接时 出现以下错误 teras
  • 如何检查iOS版本 delphi xe5/xe6

    有没有办法在 Delphi 应用程序中检查 iOS 版本 我想在 Delphi XE6 中为 iOS7 和 iOS6 创建特定的代码段 您可以使用服务版本 http docwiki embarcadero com Libraries XE6
  • React Router 的 组件中的状态是什么?

    这是他们的文档的屏幕截图 成分 https i stack imgur com qt5zs png What state他们是什么意思 ARedux state 通过一个州是什么样子的 像这样 pathname foo query x th
  • 导入 matplotlib 时 numpy 的版本错误

    When I import matplotlib 我没有收到任何错误 但是当我 import matplotlib pyplot I get RuntimeError module compiled against API version
  • 尝试将我的 LogCat 输出到文件

    有人告诉我这是一个命令行选项 但是 Eclipse 的 Run Run Configurations Target Additional Emulator Command Line Options 字段已经被占用 sdcard C andr
  • 使用 Rstudio Keras 的暹罗网络

    我正在尝试使用 Rstudio Keras 包实现暹罗网络 我尝试实现的网络与您可以在中看到的网络相同这个帖子 https sorenbouma github io blog oneshot 因此 基本上 我将代码移植到 R 并使用 Rst
  • 如何知道webkitSpeechRecognition是否启动?

    我正在制作一个机器人来听我的声音 所以我做了 this recognition new webkitSpeechRecognition 我可以这样做来开始听 this recognition start 这是停止听 this recogni
  • Java:为什么这个交换方法不起作用? [复制]

    这个问题在这里已经有答案了 我有以下代码 public class Main static void swap Integer x Integer y Integer t x x y y t public static void main
  • 使用多个字段对 solr 搜索结果进行排序 (solrj)

    我需要根据两个因素对从 apache solr 返回的结果进行排序 我们的系统中有三个实体由 solr 索引 组 项目和数据集 在结果中我希望首先显示数据集 然后是项目 然后是组 但我仍然希望它尊重每种类型的评分值 因此 例如 结果将是 得
  • mysql 查找多列重复项

    如何查找多列的重复记录 表有主键 自动递增 EG ID a id b id 1 34 23 2 34 23 3 35 25 例如我想查找具有相同a id和b id的记录 Thanks select t ID t a id t b id fr
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • 如何将事件处理程序分配给 JavaScript 中的多个元素?

    我知道如何使用 jQuery 来做到这一点 并且我知道如何使用事件委托来做到这一点 但是如何在纯 JavaScript 中做到这一点呢 例如 如何将事件处理程序分配给一堆lis 我看到var li document querySelecto
  • 代码高尔夫:弗罗贝尼乌斯数

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 编写最短的程序来计算给定正数集的弗罗贝尼乌斯数 弗罗贝尼乌斯数是不能写成集合中数字的正倍数之和
  • CKEditor 5 通过外部 url 插入图像

    我想知道如何仅通过 URL 插入图像 用户从其他网站获取它 我需要实现一个简单的img 源 在 CKEditor 5 中 问题是 默认情况下 编辑器要求我上传图像 而我需要插入外部 url 我读过很多相关主题 1 https stackov
  • 带正文的 HttpDelete

    我正在尝试使用 HttpDelete 对象来调用 Web 服务的删除方法 Web 服务的代码从消息正文中解析 JSON 但是 我无法理解如何将主体添加到 HttpDelete 对象 有没有办法做到这一点 使用 HttpPut 和 HttpP
  • Python 的“导入”内部是如何工作的?

    当您导入一个模块 然后再次重新导入它时 它会被重新导入 覆盖还是跳过 当您导入模块 a 和 b 并且还在模块 a 中导入模块 b 时 会发生什么 这样做安全吗 例如 如果该模块 b 中有一个实例化的类 您最终会实例化它两次吗 import加
  • 我在使用阴影效果时表现不佳

    我在滚动视图上放置了一些图像视图 当我拖动这个滚动视图时 我没有遇到任何问题 但是 当我对这些图像视图应用阴影效果后 拖动此滚动视图的性能很差 我使用了shadowOpacity shadowRadius 和shadowOffset 方法
  • 使用流迭代 n 次,而不是使用 for 循环创建 n 项

    假设我想创建 n 个项目 在 Java 8 之前 我会这样写 List
  • 如何构建特定函数调用的图表?

    我有一个项目 我想动态构建特定函数调用的图表 例如 如果我有 2 个模板类 A 和 B 其中 A 有一个跟踪方法 保存为图形节点 B 有 3 个方法 非跟踪方法 跟踪方法和调用 A 的跟踪方法的跟踪方法 那么我希望能够仅将跟踪的方法调用注册