用C代码打印出所有函数中的进入/退出消息

用C代码打印出所有函数中的进入/退出消息,c,debugging,logging,crash,C,Debugging,Logging,Crash,我们已经追踪了一次坠机事件好几个月了,但我们并没有真正接近。程序在看似随机的时间崩溃。由于某些原因,我们无法打印堆栈回溯。更糟糕的是,崩溃只发生在特定的硬件上,我们还没有弄清楚如何调试,或者如何使用Valgrind等等 通过修订进行二进制搜索可能是一种选择。但由于通常需要一个工作日左右的时间来产生崩溃,这将是非常耗时的 所以。我想在代码中的所有/大多数函数中打印日志消息(或类似的内容)。“进入函数X”、“离开函数Y”等类型。希望这能给干草堆上寻找针提供一些指针。有没有什么简单的方法可以做到这一点

我们已经追踪了一次坠机事件好几个月了,但我们并没有真正接近。程序在看似随机的时间崩溃。由于某些原因,我们无法打印堆栈回溯。更糟糕的是,崩溃只发生在特定的硬件上,我们还没有弄清楚如何调试,或者如何使用Valgrind等等

通过修订进行二进制搜索可能是一种选择。但由于通常需要一个工作日左右的时间来产生崩溃,这将是非常耗时的

所以。我想在代码中的所有/大多数函数中打印日志消息(或类似的内容)。“进入函数X”、“离开函数Y”等类型。希望这能给干草堆上寻找针提供一些指针。有没有什么简单的方法可以做到这一点,而不必手动执行(字面上)数千个功能?有谁知道有什么程序、脚本或宏魔术可以用于此


谢谢

您需要阅读编译器手册。可能有一些函数入口/出口挂钩,您可以声明它们将完全满足您的要求


例如,在GCC中,可以使用-finstrument函数。您可以为每个将函数地址转储到stdout(或任意位置)的函数条目编写printf。然后可以使用addr2line(来自binutils)将地址转换为函数名

我会检查你是否正在跟踪一个特定的崩溃,你可以尝试一个实际的调试器,或者像valgrind这样的软件解决方案。Valgrind通常非常适合查找内存错误的位置。@AdrianoRepetti:你认为方面定向会有什么帮助?@Happington:这就是全部问题,在崩溃的硬件上,我们实际上无法使用Valgrind或调试器。.AOP的“典型”用法(和常见用法示例)是为方法enter/exit添加日志记录。