2016-03-03 35 views
0

我的产品嵌入了TCL虚拟机来运行TCL脚本。我们基本上采取的TCL 8.4源,并将其集成到我们的产品,整个产品在C.如何跟踪printf被禁用的方式/位置?

编程现在我需要调试一些问题,最好的,我可以在运行时约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

使用'-E'编译? –

+0

你可以在'#ifdef'之后加一个'#error tcl_debug'来验证编译器是否会将fprintf放在可执行文件中。在执行'fprintf'之前,仍然需要满足多少运行时间条件。 – user3386109

回答

1

这似乎不大可能,标准库的fprintf()被禁用。相反,我看到三个主要替代方案:

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

  2. 的被称为fprintf()不是标准库,并且它不会做你期望的。它可能是TCL虚拟机代码中的本地函数,也可能是TCL虚拟机完全不同。取决于你如何将TCL集成到更大的代码中,这些可能性可能仅限于TCL的范围。

  3. stdout并不意味着你认为它的TCL代码中。这几乎可以肯定是由于某些原因,对于TCL虚拟机来说很重要的一个因素,那就是#defined。在这种情况下,有可能或可能没有办法获得该范围内的真实stdout

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

+0

Tcl在标准含义上留下'fprintf'和'stdout',并且只用它们进行调试。 –