我的产品嵌入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,但仍然看不到打印出来。
有什么建议我应该从这里开始吗?
答案 0 :(得分:1)
似乎不太可能禁用标准库fprintf()
。相反,我看到三个主要的选择:
您添加的fprintf()
永远不会被调用。这可能是因为它处于错误的位置,因为条件编译指令会导致它被省略,或者可能是出于其他原因。
被调用的fprintf()
不是标准库,它没有达到预期效果。它可能是TCL VM代码中的本地函数,或者TCL VM可能#define
它完全是其他东西。根据您如何将TCL集成到更大的代码中,这些可能性可能仅限于TCL。
stdout
并不代表您认为它在TCL代码中的作用。这几乎肯定是由于#define
d由于其他原因而导致的,因为某些原因对TCL VM很重要。在这种情况下,可能会或可能没有办法在该范围内获得真实的stdout
。
我建议您使用fprintf
和stdout
符号集成的TCL代码,以查找宏定义和替代实现。检查预处理器输出以确保您的呼叫仍然存在(并且仍然是您期望的呼叫)也是值得的。如果您正在使用GCC进行编译,那么您可以预处理源代码而无需通过gcc -E
编译结果。