第三十二章 长夜漫漫-《这个吞金兽不好养》


    第(2/3)页

    proc    fun(arg){

    #body

    }

    它看似一个关键字;但tcl里一切都是字符串,因此这个proc实质上是个函数,它接受函数名、参数列表、函数体三个参数……

    叶新晨也是把系统的proc改名叫_sys_proc,自己写了个proc;这样当用户声明一个函数/过程时,他的声明将以字符串格式先传给他。

    这样子的话叶新晨就可以做一些修改,把一些逻辑插进用户编写的代码中,然后再把修改后的代码传给_sys_proc。

    通过这种方式,叶新晨就接管了tcl的一切;然后修改了它的异常/返回流程,识别出“用户未捕捉的异常”。

    毕竟叶新晨是记录了每个函数在某次被调用时、在调用链上所处的层级。尤其接近顶层尚未捕获就会影响到当前测试用例、当前测试套甚至引起整个程序过早退出,这些都是要记录的。

    现在,当程序出错时,如果通过异常处理程序解决了问题、允许程序继续执行了,那么叶新晨就不做任何动作。

    但如果没有处理异常、使得测试失败甚至程序退出,那么叶新晨就能在执行下一条语句之前把整个调用链打印出来——从函数调用关系到每个函数的局部变量内容、再到异常传递路径,巨细靡遗。

    这个设计相当于函数返回时会多执行几条语句,把局部变量等信息保存在内存中;只要程序不崩溃,那么这些信息就自动丢弃;而一旦程序要崩溃,它就会写到磁盘文件中——叶新晨自己搞了个日志滚动机制,专门记录最近十次崩溃信息,并不会无限侵占磁盘空间。

    通过这个东西,再付出微不可察的时间代价,叶新晨给所有tcl程序增加了core    dump功能。

    这显然是个重大利好。

    这就是为什么他们为什么愿意花费十万请叶新晨也帮忙做这个功能。

    不过毕竟刚刚完成了另一个悬赏,所以晚上的时候叶新晨也不会立刻扎进去,他要好好的休息一个晚上,也就是今天晚上他不想熬夜了。
    第(2/3)页