7

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

经常发生的情况是,我放置了一堆打印语句,构建我的代码并运行它只是意识到我也应该在其他十几个地方放置打印。然后再次开始长达一小时的过程。

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

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

4

5 回答 5

11

您没有说明您正在使用的编译器,但 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/

于 2011-03-13T20:35:15.867 回答
1

你可以使用这样的宏

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

然后用 begin 和 end 宏替换所有的{, }(__func__ 是一个返回函数名的宏,在 C99 中定义,还有其他编译器的等效宏)

于 2011-03-13T20:32:40.730 回答
0

对于只有 5-6 个文件,我会手动进入并在每个函数中添加一个 PRINT("name of function") 宏,然后将其定义为输出字符串,或者什么都不输出

您可以使用 ctags 分析文件并自动构建它,但除非您有 100 个文件,否则手动完成会更快

于 2011-03-13T20:34:42.647 回答
0

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

于 2011-03-13T20:36:05.460 回答
0

我建议您使用调试器,例如 GBD。这样,您甚至可以“逐步”运行程序并分析此类情况。我看不出有理由在每个函数中打印一些东西。

于 2011-03-13T20:36:31.697 回答