【问题标题】:Print out entering/exiting message in all functions in C code在 C 代码中的所有函数中打印出进入/退出消息
【发布时间】:2014-08-23 07:02:33
【问题描述】:

几个月来我们一直在跟踪一次崩溃,但我们并没有真正接近。该程序在看似随机的时间崩溃。由于某种原因,我们无法打印出堆栈回溯。更难的是,崩溃只发生在特定的硬件上,我们还没有弄清楚如何调试,或者如何使用 Valgrind 等。

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

所以。我想在整个代码中的所有/大多数功能中打印日志消息(或类似的东西)。类型为“输入函数 X”、“离开函数 Y”等。希望这可以给出一些关于在哪个干草堆中寻找针的指针。有没有简单的方法可以做到这一点,而无需手动通过(从字面上看)数千个功能?任何人都知道可以用于此的任何程序或脚本或宏魔法吗?

谢谢

【问题讨论】:

  • 我会检查AOP
  • 如果您正在跟踪特定的崩溃,您可以随时尝试使用实际的调试器或软件解决方案,例如 valgrind。 Valgrind 通常非常适合查找内存错误的位置。
  • @AdrianoRepetti : 你认为面向方面会有什么帮助?
  • @Happington :这就是整个问题,在崩溃的硬件上,我们实际上不能使用 valgrind 或调试器..
  • AOP 的“典型”用法(和常见用法示例)是为方法进入/退出添加日志记录。

标签: c debugging logging crash


【解决方案1】:

您需要阅读编译器手册。可能有函数进入/退出挂钩,您可以声明它们将完全按照您的要求进行。

例如,在 GCC 中,您可以使用 -finstrument-functions https://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Code-Gen-Options.html。您可以在 printf 中为将函数地址转储到标准输出(或任何您喜欢的任何位置)的每个函数条目进行编码。然后,您可以使用 addr2line(来自 binutils)将地址转换为函数名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2014-10-17
    • 2013-09-04
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多