如何以编程方式在c文件中的每个函数中添加print语句?

时间:2011-03-13 20:27:59

标签: c debugging call flow

我正在研究嵌入式代码,现在完全依赖于函数内部的打印来确定执行流程(没有可用的堆栈跟踪功能)。

经常发生这样的情况:我放了一堆打印语句,构建我的代码并运行它只是为了意识到我应该在其他地方放置打印件。然后再次启动一小时的流程。

是否有一种简单的方法可以获取我要分析的5或6个c文件,并运行一些可以进入的工具并在每个函数中添加一个print语句? (这显然必须在变量声明之后,因为这是在C)

每次有if / else或switch / case时,更好的是打印。基本上是任何条件语句。

5 个答案:

答案 0 :(得分:10)

你没有陈述你正在使用的编译器,但是gcc有一个非常方便的开关:

-finstrument-functions

在每个函数入口和出口处插入一个特殊调用。您可以使用此调整仅编译相关文件,无需修改源代码。

调用您应创建的两个函数:

      void __cyg_profile_func_enter (void *this_fn,
                                     void *call_site);
      void __cyg_profile_func_exit  (void *this_fn,
                                     void *call_site);

Etrace是一个专门用于利用此工具创建呼叫追踪的工具,请参阅http://ndevilla.free.fr/etrace/

答案 1 :(得分:1)

你可以使用像这样的宏

 #define begin {printf(__func__##" Started");
 #define end printf(__func__##" Ended");}

然后用开始和结束宏替换所有{}(__ func__是一个返回函数名的宏,在C99中定义,其他编译器也有其他等价宏)

答案 2 :(得分:0)

对于只有5-6个文件,我会手动进入并在每个函数中添加一个PRINT(“函数名称”)宏,然后将其定义为输出字符串,或者没有

您可以使用ctags分析文件并自动构建,但除非您有100个文件,否则手动执行此操作会更快

答案 3 :(得分:0)

如果vim是您最喜欢的编辑器,您可以安装此插件:http://www.vim.org/scripts/script.php?script_id=213并自定义相关模板。对许多不同的任务都有用。 (它适用于您将定义的新功能,这不是您的情况,但可能对将来的使用有用)

答案 4 :(得分:0)

我建议您使用调试器,如GBD。这样你甚至可以“一步一步”运行程序并分析这些条件。我没有理由在每个功能中打印一些东西。