gpt4 book ai didi

python - 如何添加对 C 函数的分析调用?

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:25 25 4
gpt4 key购买 nike

我正在尝试创建一个 python 脚本,该脚本将 C 源代码修改为时间并收集有关所选函数执行的其他指标。

目标是从配置文件开始,然后运行修改源代码的脚本以完成以下操作:

想法A:

foo_profile()
{
start_profile();
foo();
end_profile();
}

想法 B:

foo()
{
start_profile();
//dostuff
end_profile();
}

A 的考虑:

  • 策略:似乎最简单的方法是插入拦截原型(prototype)/定义到相同的头文件/src 文件中。离开其他一切都一样(以防某些来电者没有改变)。和的当然为 start/end_profile() 添加 includes。

    • 需要识别 foo() 的正确调用者
      • 有一些具有相同名称的函数受到更高级别构建系统的保护,该系统将事物拆分为项目/分区(很难自动确定,但是一个特定的配置可以解决这个问题)
    • 需要确定具有 foo() 的正确 header
    • 参数需要通过并在堆栈上复制,这不是什么大问题,但可能会导致一些问题

B的考虑:

  • 策略:这个很简单,只需添加配置文件调用即可。它会有很多烦人的问题需要处理(如下)。
    • start_profile() 需要在变量声明之后调用(arm)
      • 不确定这个错误是否可以用编译器标志忽略,或者有什么原因吗? (我知道特定于编译器,但一般来说)
      • 可以很容易地找到简单的局部变量(ctags),但是有一些宏被调用以进行参数验证,最终声明难以自动查找的变量。最终可能会有一个宏黑名单来检查是否添加个人资料电话。
    • end_profile() 当然需要在所有返回之前立即调用
      • 如果调用设置如下,则返回中的昂贵函数调用最终不会被分析:end_profile();return expensive_call();
        • 当然可以给 expensive_call() 一个返回变量(最初声明),类型自动从包含的 header 。增加一些复杂性和潜在的问题(更多堆栈,可能是一些奇怪的宏东西来破坏东西)
      • 有什么方法可以告诉编译器将代码添加到序言/结尾? (我知道这是特定于编译器的,但如果可能的话,只要你有一个大概的想法)

概述/问题:

实现明智的 A 是最有吸引力的,但对于收集的信息和易于配置的 B 会更好。 B 似乎更难/更不可靠地实现。当然还有其他方法,比如修改链接,但我认为以前的策略最好。

所以我的问题归结为这里是否有我遗漏的策略?鉴于这个问题,你会怎么做?有什么我在这里没有提到的我应该考虑的吗?对分散的问题或一般指导的任何帮助将不胜感激。

如果有任何不清楚的地方,我会很快进行编辑和澄清。第一个问题,所以如果我搞砸了什么,请告诉我。

编辑:-------------------------------------------- ------

我的 ARM 编译器有一个标志,允许您提供自己的入口/导出定义来执行此操作 (--gnu_instrument)。如果出于某种原因编译器不允许你这样做我认为最简单的方法是实际更改真实定义的名称并使用脚本在具有相同签名的同一文件中添加回“真实”函数名称(不是确定为什么我没有想到这一点)。这就是为什么所有调用都经过检测并且您不必担心“拦截”的原因。像这样:

初始:

foo()
{
//do stuff
}

检测:

foo()
{
start_profile();
foo_unique_id();
end_profile();
}

foo_unique_id()
{
//do stuff
}

最佳答案

看起来您正在尝试做的事情称为代码检测,有点类似于 this post . GCC 有 -finstrument-functions(如果您使用的是 GCC),您可以阅读 here和官方文档 here . -finstrument-functions 似乎采用了第二种方法,将跟踪调用添加到现有函数中而不是包装它。

关于python - 如何添加对 C 函数的分析调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com