如何跟踪printf被禁用的方式/位置?

时间:2016-03-03 20:46:48

标签: c tcl

我的产品嵌入TCL VM以运行TCL脚本。我们基本上采用TCL 8.4源代码并将其集成到我们的产品中,整个产品用C编程。

现在我需要调试一些问题,最好能在运行时对TCL VM有所了解。所以我在TCL源代码中添加了一些printf,但是我看不到任何打印输出。请注意,添加到代码中的printf按预期工作。

这让我怀疑在TCL的某个地方禁用了printf。

我在TCL源代码中看到以下代码段:

#ifdef TCL_COMPILE_DEBUG
  fprintf(stdout, "  Starting stack top=%d\n", eePtr->stackTop);
  fflush(stdout);
#endif

我通过启用TCL_COMPILE_DEBUG来重建TCL,但仍然看不到打印出来。

有什么建议我应该从这里开始吗?

1 个答案:

答案 0 :(得分:1)

似乎不太可能禁用标准库fprintf()。相反,我看到三个主要的选择:

  1. 您添加的fprintf()永远不会被调用。这可能是因为它处于错误的位置,因为条件编译指令会导致它被省略,或者可能是出于其他原因。

  2. 被调用的fprintf()不是标准库,它没有达到预期效果。它可能是TCL VM代码中的本地函数,或者TCL VM可能#define它完全是其他东西。根据您如何将TCL集成到更大的代码中,这些可能性可能仅限于TCL。

  3. stdout并不代表您认为它在TCL代码中的作用。这几乎肯定是由于#define d由于其他原因而导致的,因为某些原因对TCL VM很重要。在这种情况下,可能会或可能没有办法在该范围内获得真实的stdout

  4. 我建议您使用fprintfstdout符号集成的TCL代码,以查找宏定义和替代实现。检查预处理器输出以确保您的呼叫仍然存在(并且仍然是您期望的呼叫)也是值得的。如果您正在使用GCC进行编译,那么您可以预处理源代码而无需通过gcc -E编译结果。