Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Tcl库和/或Tcl内部构件的Tcl脚本非检测调试器?_C++_C_Tcl_Tcl Api - Fatal编程技术网

C++ 使用Tcl库和/或Tcl内部构件的Tcl脚本非检测调试器?

C++ 使用Tcl库和/或Tcl内部构件的Tcl脚本非检测调试器?,c++,c,tcl,tcl-api,C++,C,Tcl,Tcl Api,我想知道是否可以使用tcl库API和/或tcl内部接口构建tcl脚本调试器,我的意思是它们是否包含足够的数据来实现这一点。我注意到,现有的tcl调试器为tcl脚本提供工具,并使用这个附加层。我的想法是使用Tcl_CreateObjTrace来跟踪每个已评估的命令,并将其用作检索调用堆栈、局部变量等的点。问题是,在评估时似乎并非所有信息都可以从API访问。例如,我想知道当前评估的是哪一行,但Interp仅在顶级评估中有此类信息iPtr->cmdFramePtr->line对于过程的主体为空。有人尝

我想知道是否可以使用tcl库API和/或tcl内部接口构建tcl脚本调试器,我的意思是它们是否包含足够的数据来实现这一点。我注意到,现有的tcl调试器为tcl脚本提供工具,并使用这个附加层。我的想法是使用Tcl_CreateObjTrace来跟踪每个已评估的命令,并将其用作检索调用堆栈、局部变量等的点。问题是,在评估时似乎并非所有信息都可以从API访问。例如,我想知道当前评估的是哪一行,但Interp仅在顶级评估中有此类信息iPtr->cmdFramePtr->line对于过程的主体为空。有人尝试过这种方法吗?这有什么意义吗?也许我应该查看Interp中的散列条目?对于Tcl 8.5来说,任何线索和意见都是最好的。

对于非侵入式调试系统,您最好尝试使用一个执行步骤跟踪,该跟踪在命令执行期间调用每个命令,该跟踪附带信息框,以实际获取信息。下面是一个简单的版本,附加到源代码,以便您可以查看整个脚本:

proc traceinfo args {
    puts [dict get [info frame -2] cmd]
}
trace add execution source enterstep traceinfo
source yourscript.tcl

为大量产出做好准备。info框架外的字典可以有各种相关条目,例如关于命令行号和源文件的信息;cmd条目是调用的命令的未替代源。如果您想要替换版本,请参阅上面跟踪回调的相关参数traceinfo。

对于@Yann,我不想调试Tcl解释器。我想调试Tcl脚本,比如基于TclPro do的TclPro或Komodo。为什么您会发现重载proc和使用跟踪来构建调试器是不可接受的?请注意,大多数Tcl调试器,尽管它们通过重载proc来安装Tcl脚本,并且可能设置和跟踪所有内容,但实际上并不需要对脚本进行任何修改。这里的指令意味着与其他语言完全不同的东西。@slebetman我没有说这是不可接受的。有没有其他脚本语言是用这种方式调试的呢?。我很好奇我是否可以在不插入指令的情况下实现同样的效果,而且可能非插入指令的方式会更快,并提供更多功能,例如,您不需要选择插入哪个脚本。不幸的是,信息框只提供了特定进程内相对行的信息,脚本中没有关于绝对帧位置的信息。此外,我在Tcl Core中挖掘了一点,在评估时似乎根本没有关于proc位置的信息,因此,插装似乎是执行全功能调试工具的唯一方法: