Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式在c文件中的每个函数中添加打印语句?_C_Debugging_Call_Flow - Fatal编程技术网

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

如何以编程方式在c文件中的每个函数中添加打印语句?,c,debugging,call,flow,C,Debugging,Call,Flow,我正在研究嵌入式代码,目前完全依赖函数内部的打印来确定执行流程(没有可用的堆栈跟踪功能) 经常发生的情况是,我放了一堆print语句,构建代码并运行它,结果发现我也应该把print放在其他十几个地方。然后再次开始长达一小时的过程 有没有一种简单的方法来获取我想要分析和运行的5或6个c文件,并在每个函数中添加打印语句?(这显然必须在变量声明之后,因为这是在C中) 更好的办法是每次有if/else或switch/case时都打印。基本上是任何条件语句。您可以使用这样的宏 #define begin

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

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

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


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

您可以使用这样的宏

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

然后用begin和end宏替换所有的
{
}
(\uu func\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu宏,然后将其定义为要么输出字符串,要么什么都不输出


您可以使用ctags分析文件并自动生成,但除非您有100个文件,否则手动生成会更快,您不需要说明正在使用的编译器,但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是专为利用此功能创建调用跟踪而设计的工具,请参见

如果vim是您最喜欢的编辑器,您可以安装此插件:并自定义相关模板。可以用于许多不同的任务。(它适用于您将定义的新函数,这不是您的情况,但可能对将来的使用有用)

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

祝你好运,写一个正则表达式就可以做到这一点。这个理由是存在的。当我想找出ghostscript基于输入端的一个微小调整做出一些根本不同的判断的原因和位置时,比较两个1.5 gb的调用跟踪很快就发现了分歧点。祝您使用gdb顺利完成这样一个程序…;-)@mvds当然可以,先生,接受理由!:-)无论如何,我不想说程序可以一步一步地运行,只是说这是一个有用的工具。谁知道这不是OP想要的。。。但是谢谢你指出这样的事情。我不是一个大的C大师,只是每天学习。我不认为我可以在我的情况下使用它。它在嵌入式设备上。显然有JTAG调试器可以使用,但我还没有。谢谢。我没有使用gcc,但我会问我公司的c专家是否存在类似的问题。我使用sourceinsight和notepad++但我会检查一下。谢谢是的..就是这样..这些文件有很多很多函数,我相信我将来也需要这样做..这就是为什么我想用编程的方式来做..如果没有其他方法可以工作,那么这就是我要做的:)谢谢,这真的很有用。我不知道这个宏。谷歌搜索还发现了一些关于PRETTY_函数的信息,但问题仍然是,如果我让宏将print(实际上它不是printf..它是我们环境的一个变体)放在最上面,将会有很多编译错误,因为var声明将不再放在最上面。同样,由于可能在这里和那里多次返回,最终一方也会遇到问题。如果能够以某种方式将start宏放在每个函数中变量声明的末尾,那么我仍然希望只使用start宏。