关于程序的debug

 debug是指定位在应用程序内的故障(功能不全以及未预想的操作等原因),进行修改的工作。
 吉里吉里内含有数个debug辅助功能,使用这些功能,能够对程序进行debug,接下来说明debug的方法。

debug辅助窗口

吉里吉里为支持debug而提供了几个辅助窗口。请详细各参考链接的说明。
控制器
能够打开各个辅助窗口、停止事件发生、转储TJS上下文、生成消息映射文件、强制结束系统。  
脚本编辑器
可以用来编写并执行简单的 TJS 脚本。当异常发生时时,为了指出异常发生的位置,有时会启动一个名为「脚本编辑器 (异常通知)」的脚本编辑器窗口。(译注:汉化的吉里吉里内核就是使用‘例外通知’的字样,实际异常通知更合情理)
表达式监视器
可以轻松地一次查看许多表达式的结果。
控制台
可以显示吉里吉里的系统和用户脚本输出的各种调试用消息。另外,也可以输入TJS2式并当场执行,显示公式的结果。

 特别是在控制台上,通过Debug.message 显示用户程序在程序中输出的消息。在程序的任意位置调用方法,将变量的内容显示在控制台上,可以看到正在执行的变量的内容。
 另外,在控制台底部的输入栏中输入TJS2式,按下Enter键,可以当场执行该式。这对于直接调用正在运行的对象的方法或将值赋值给对象的属性或变量非常有用。
 有关向控制台显示消息的方法和在文件中记述日志的方法,请参照 命令行选项 的「debug相关的选项」以及 Debug 类。

debug模式

 在命令行选项 中指定 '-debug' (将“debug模式”设为“有效”) 后、可以使吉里吉里在调试模式下动作。
 在调试模式下,TJS2的动作会变慢,但会启用一些便于调试的功能。

类信息追加功能
 加强关于tjs2的对象相关信息。
 非debug模式下、为了获得kag.saveSystemVariables的信息,在控制台中输入kag.saveSystemVariables,仅有
console : kag.saveSystemVariables = (object)(object 0x0279E130:0x01EB0BD4)
 会显示出来、而debug模式下
console : kag.saveSystemVariables = (object)(object 0x0279E130[(function) KAGWindow.saveSystemVariables]:0x01EB0BD4[instance of class KAGWindow])
 会以此种方式显示类型信息(在“:”分隔的两个部分中,前一部分是对象的类型,后一部分是对象运行的上下文)。
 此功能不仅在控制台中显示值时有效,而且在所有对象(在当前版本中)转换为字符串的过程中都有效。
对象内存泄漏检测功能
 启用退出时警告未删除(未释放)对象的功能。
 TJS2本来是由垃圾收集功能自动删除创建的对象,不需要明确的删除指示。但是,由于插件、吉里吉里本体的错误、循环引用等原因,对象有留在内存中而不被删除(泄漏)的可能性。
 在调试模式下,退出时尚未释放的对象将导出到控制台日志文件中。
 请注意,即使只有一个对象没有被释放,也会搜索与该对象相关的所有对象,因此日志文件可能会变得十分巨大。

   请注意,System.exit 方法会以接近强制退出的形式退出应用程序,如果使用该方法退出应用程序,会泄漏很多对象,记录大量日志。

Note
循环引用是指A引用B,B引用A的状况。
例如,以下脚本生成循环引用:
var a = %[], b = %[];
a.b = b; b.a = a;

在这种情况下,对象a需要b,对象b需要a。TJS2所采用的垃圾收集方法(引用计数法)很难检测到这种情况并释放对象,因此TJS2不会检测到这种情况。因此,永远不会删除这些对象(可以通过invalidate运算符显示禁用其中一个对象来截断循环引用)。

在插件中,如果错误地使用引用计数器,则对象可能会泄漏。创建插件并操作其中的TJS2对象时,请充分注意引用计数器的处理。

在删除对象上执行脚本的警告
 删除或禁用对象时,将调用finalize方法。
 删除对象的时间在TJS2中无法确定,因此在奇怪的时间点会调用finalize方法,以导致意外的行为。在调试模式下,会在这种不稳定的时间节点,即垃圾收集器删除未销毁的对象并调用finalize方法的时候,在控制台上显示警告。
 警告如下。

警告: anonymous@0x016DFA7C(9)[(function) finalize]: 正在删除的对象: 0x0167DD44[instance of class A] 上运行代码。创建此对象时的调用历史记录如下::
                     anonymous@0x016DFA7C(13)[(top level script) global]

   为了避免这种情况,建议您在new中创建的对象在使用完后显式使用invalidate运算符无效化对象。
 但是,对于没有finalize方法(如Array、Dictionary或Date)或finalize方法不会引起特别问题的类对象,可能不需要显式禁用。
 如果对象在没有显式禁用的情况下被删除,并且TJS2脚本将在该上下文中运行,则会显示上述警告。
检索调用历史记录功能
 可以从脚本中获取TJS2的函数/方法调用历史记录。
 需要使用 Scripts.getTraceString 方法。
 如果在程序过程中有任何问题,并且不知道该方法是从哪里调用的,则可以使用该方法将调用历史记录输出到控制台。