找回密码
 注册
Simdroid-非首页
查看: 518|回复: 14

【原创】MATLAB脚本调试工具

[复制链接]
发表于 2007-8-13 01:03:43 | 显示全部楼层 |阅读模式 来自 上海
起因:
写了太多的程序,交给测试部出了太多的BUG。测试人员不安装开发语言环境,因此有些问题不能在测试人员的计算机上调试,因此调试成本很大,浪费了大量的时间才解决问题。前几日终于冒出一个想法,是否可以在发布后的产品上调试,分析数据,调用模块,激活控件的回调函数?
热身:
马上写了一个小界面。这个东西,只能内部调试,还需要先把它隐藏起来。只有一个暗门,才能打开这个调试工具。调试界面很简单,主要有一个edit(用于书写脚本),三个button(调试,清空,关闭)。
方案:
1.eval方式:
脚本可以通过eval来执行。eval虽然不能直接编译,一个兄弟王三有经验,他说matlab提供了一个mexEvalString函数,可以编译成一个mex文件,来执行脚本。一切顺利,他很快就帮我搞定了这个mex文件。我写了一段m代码,可以执行。编译后,放到测试环境中,可以执行脚本命令。但是,不能进行任何赋值计算,在matlab环境中却是可以的。百思不得其解,询问了SCIE兄弟,他讲可能是脱离了matlab环境,就不能新开内存空间了。mexEvalString不支持输出参数的,这下就麻烦了。查找出来的句柄,不能保存,这么提取它的属性呢?不能一行命令,写1000多个字吧。
2.feval方式
eval不行,还是用我最擅长的feval方式吧。这个可是我五年前的发明,一直没有派上用场。eval不支持编译,feval可以支持编译。我可以将脚本加一个函数壳(function varargout = funname(varargin);),然后打印成一个funname.m文件,再调用mcc,编译成mex文件。解决了中间的小麻烦,可以编译了。出现了新的问题,mex文件一旦使用后,就不能删除,即使clear了函数,也不能删除。因为每次调试脚本,都要重新生成m文件,重新调用,重新feval的。这个麻烦就大了,不能每调试一次,就重启一下软件吧。想到一个方法:编译成与时间相关的临时命名的exe文件,然后执行exe文件。还没有执行这个方案,我就放弃了。因为我已经遇到了一个麻烦,会产生很多垃圾文件;没有相应的m底层代码环境,怎么编译?我调试的计算机,可是有代码环境的。
3.feval+脚本方式
脚本还是脚本,只是把它们解析为feval可以识别的函数,然后执行。feval支持输入输出参数。这时我想到了一位很重要的同事(现在英国留学),他第一天来面试时,问了我一个问题,如何解析+-*/符号。当时我没有回答出来,因为我想不到他为什么会这么问?这么多年过去了,我才需要想想这个问题。不想不知道,一想吓一跳:+不就是plus嘛。a = 1 + 1;解析为a = plus( 1, 1 );不就可以嘛?简单的问题,求解答案的过程不简单。将最需要的代码,拿出来分析了一下。每行脚本就是一个表达式,可能有赋值的表达式。而feval的输入参数,是一个cell数组。而我接受测试人员输入的,是一个个字符串。我需要将这个字符串,根据语法规则,翻译为[输出参数=]函数,输入参数1,输入参数2...。而这个语法规则,参考了m语言,但是我可以定义得很简单,比如右括号,单引号都可以省略不要。节约打字的时间,就是节约调试时间。(语法规则,虽然简单,也要好几百字,就不详述了:))在环境下反复修改,测试,增加各种遇到的新情况,新规则,花了两天时间,总算搞定。暗藏机关后,编译的新环境到了测试部。有人发现了一个严重问题,赶紧过去,调出我的脚本工具,毕竟代码不是全部能背的,来回几次,总算把代码抄进调试工具,把数据都提取出来,分析出bug的可能原因和位置,回到自己的座位很快搞定这个问题。初战告捷,小有成就,可惜他们并没有欢呼雀跃。
总结:
整个过程,短暂而有丰富。比如,其中的display,可以编译,但是编译后找不到display这个函数,自己写一个display又很麻烦。正当我鼓足勇气写一个时,突然想到了泄漏,不加分号的赋值表达式或变量,都有泄漏。这就是举重若轻吧。易用性还不太好,很多测试人员都不知道里面的代码怎么写的,怎么调用其中的模块?怎么解析每一个控件的属性?这个是下一步需要完善的。
感谢SCIE和王三的帮助和表扬,他说这个思想还有点意思,就分享给大家吧!

评分

1

查看全部评分

发表于 2007-8-13 09:09:24 | 显示全部楼层 来自 广东深圳

UP

Simdroid开发平台
顶!
小弟又一次站在MATLAB面前,所以,还是从头学起!

学习,学习,再学习!:D

关注:数据处理,图像识别,生物信息学(工具箱)

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-13 15:17:30 | 显示全部楼层 来自 湖北武汉
感谢分享
先拍个砖,砸个路:lol
有几个地方 没看懂
1。出现了新的问题,mex文件一旦使用后,就不能删除,即使clear了函数,也不能删除。
      这个不能删除是甚么意思?
2。突然想到了泄漏,不加分号的赋值表达式或变量,都有泄漏。
     这个泄漏是指?内存泄漏?
3。测试人员机器上没有开发环境,那么,他们机器上是编译后的纯EXE,还是M文件+MEX+EXE的混合体?
4。解析每一个控件的属性。
     我在想,不知道能不能结合C MEX和C/C++数学图形库。
     或者说,用VC写你这个测试工具,应该也是可以的吧?我改天试试。
     通过API/C/C++/MEX,“解析每一个控件的属性”也许是可以的。
     欢迎大家探讨。
原帖由 cwit 于 2007-8-13 01:03 发表

起因:
写了太多的程序,交给测试部出了太多的BUG。测试人员不安装开发语言环境,因此有些问题不能在测试人员的计算机上调试,因此调试成本很大,浪费了大量的时间才解决问题。前几日终于冒出一个想法,是否可以在发布后的产品上调试,分析数据,调用模块,激活控件的回调函数

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-14 11:50:12 | 显示全部楼层 来自 上海
1。出现了新的问题,mex文件一旦使用后,就不能删除,即使clear了函数,也不能删除。
      这个不能删除是甚么意思?

编译mex文件,会产生dll文件.这就需要覆盖原来的dll文件.一个dll文件被加载到内存后,就不能直接删除了.不能删除dll,就不能编译新的文件.

2。突然想到了泄漏,不加分号的赋值表达式或变量,都有泄漏。
     这个泄漏是指?内存泄漏?

     泄露,就是a = 1,不加分号,系统默认会显示a的数值,这个是按照一定的格式打印出来的.

3。测试人员机器上没有开发环境,那么,他们机器上是编译后的纯EXE,还是M文件+MEX+EXE的混合体?

    编译成纯EXE, M文件不能被 MEX文件或者EXE文件调用.

4。解析每一个控件的属性。
    更多的是解析回调函数,可以重新执行这个鼠标动作.

谢谢你的问题!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-14 12:58:06 | 显示全部楼层 来自 湖北武汉
第四个问题也许可以通过解析消息处理函数,模拟消息来解决。
PS:
随时随地地方便执行你的脚本
以及脚本与你的控件或者说代码交互
将这两个结合,是难点。
单纯地针对特定的脚本,而不考虑解析,控制控件,模拟控件,应该不难
我一开始考虑的是C MEX的方式
不过,这样不好方便输入执行你的脚本。
因为C MEX无法交互你的EXE中的函数
除非,除非,除非,你的底层函数,即脚本需要调用的一些函数已经有C编译了

[ 本帖最后由 shunfly 于 2007-8-14 13:53 编辑 ]
回复 不支持

使用道具 举报

发表于 2007-8-14 21:03:17 | 显示全部楼层 来自 新加坡
看起来很高深呀,看了好几遍,还没有完全看懂。也没有发现下载,是不是还没有开放给我们测试?

设计思想是不是在一个开发好的系统中再增加一个新功能,用户可以使用类似matlab的语言语法,通过一些简单的脚本来调用系统中已有的模块功能?

如果是的话,那么那个系统可能需要作大量的修改以支持这种功能。各个模块可能都要有”导出“的界面以供用户以这种方式调用。大家应该见过这样的软件了,比如Ansys,Sysnosie等等,都内嵌一个脚本解释器,用户可以通过脚本的方式调用那些原本可以用GUI的方式调用的功能。不过如果你的系统本身就是用matlab开发的,那么,不用另外再去写一个脚本解释器了,直接可以用matlab的语法规则。

没看懂为什么要编程c-mex,好像匿名函数就能行。

以上只是个人拙见。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-15 10:59:48 | 显示全部楼层 来自 上海
首先表示抱歉,这个逻辑思路没有讲清楚.
是这样的,有这么一个程序,是有好几十万行代码写的,已经编译成mex文件对外发布了.但是在使用过程中,还是有一些意外的错误.这个时候,需要分析数据,或者连续调试函数流程.而这需要调用已经编译后的mex文件中的函数.所以做了这么复杂的处理.
而这个调试工具,是脱离m的环境使用的.因此不能使用commond工具.另外,m代码,编译后,不能直接运行.
回复 不支持

使用道具 举报

发表于 2007-8-15 17:53:42 | 显示全部楼层 来自 湖北武汉

请教有关gui的问题

各位高手,麻烦告知如何编pushbutton的回调函数,使得每按一次pushbutton键,就会使参数n自动加一

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-15 18:27:30 | 显示全部楼层 来自 湖北武汉
我是这么理解的:lol
一个GUI,10个FUNCTION
其中一个是留的后门
找BUG时使用
编译后,如何利用那个后门,实现数据输入输出。
如果是简单的程序,在那个后门中预留其余9个FUNCTION的接口。
输入输出,查找BUG,倒是可以
但如果,大软件,FUNCTION很多,比较麻烦。
原帖由 taohe 于 2007-8-14 21:03 发表
看起来很高深呀,看了好几遍,还没有完全看懂。也没有发现下载,是不是还没有开放给我们测试?

设计思想是不是在一个开发好的系统中再增加一个新功能,用户可以使用类似matlab的语言语法,通过一些简单的脚本 ...
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-16 09:38:57 | 显示全部楼层 来自 上海
原帖由 shunfly 于 2007-8-15 18:27 发表
我是这么理解的:lol
一个GUI,10个FUNCTION
其中一个是留的后门
找BUG时使用
编译后,如何利用那个后门,实现数据输入输出。
如果是简单的程序,在那个后门中预留其余9个FUNCTION的接口。
输入输出,查找BUG,倒是可以
但如果,大软件,FUNCTION很多,比较麻烦。 ...

是这样的,那10个funtion都是可以调用的,只要先提取出来这10个函数的输入参数.
关于语法,设计的比较简单,希望下一步支持中文关键子.
比如:handle = findobj( 'Tag', 'MapPage' ) ;可以写成如下几种形式.
handle = findobj( Tag, MapPage )
handle = findobj( Tag, MapPage
handle = findobj, Tag, MapPage
handle = findobj, 'Tag', MapPage ;
handle = 查找(标记,MapPage ) ;
回复 不支持

使用道具 举报

发表于 2007-8-16 21:43:35 | 显示全部楼层 来自 湖北武汉
和识别1+4/(4+4)一样
这个应该属于类似于前缀后缀表达式的识别问题
应该不难:lol
不过handle = findobj( Tag, MapPage
类似于这样的属于括号不匹配问题
CWIT是否应该考虑一个统一的准则
比如尽量以;为开始结尾标记?
这样,
handle = 查找,标记,哈哈;
也好识别
或者每句以某特定符号开头
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-17 09:17:46 | 显示全部楼层 来自 上海
原帖由 shunfly 于 2007-8-16 21:43 发表
和识别1+4/(4+4)一样
这个应该属于类似于前缀后缀表达式的识别问题
应该不难:lol
不过handle = findobj( Tag, MapPage
类似于这样的属于括号不匹配问题
CWIT是否应该考虑一个统一的准则
比如尽量以;为开 ...

有识别规则的,太罗嗦,就没有讲.比如,右括号舍去,逗号分隔函数和变量.结尾无分号,打印变量.
目前,只支持一个输出参数,也只能支持顺序结构.还没有想到支持if和for结构.
其实解析1+4/(4+4),还比较麻烦的.现在还没有搞顶.需要考虑优先级,并且要解析成多个表达式才行.
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-21 09:48:20 | 显示全部楼层 来自 上海
其中有一个技巧:
输出参数,可能作为后面执行函数的输入参数,因此有一个变量传递.
我采用了一个cell结构,保存所有的输出参数,对输入参数进行识别,如果是前面的输出参数,就将cell结构中的数据,传入后面的执行函数.

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-26 17:13:30 | 显示全部楼层 来自 湖北宜昌
规模越来越大了
开始类似于一个编译器的语法分析过程了
或者开始类似于以前轰轰烈烈的中文开发语言
原帖由 cwit 于 2007-8-17 09:17 发表

有识别规则的,太罗嗦,就没有讲.比如,右括号舍去,逗号分隔函数和变量.结尾无分号,打印变量.
目前,只支持一个输出参数,也只能支持顺序结构.还没有想到支持if和for结构.
其实解析1+4/(4+4),还比较麻烦的.现在还 ...
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-21 14:59:31 | 显示全部楼层 来自 上海
这个工具很有用处!
现在遇到一些产品的疑难杂症,就把软件中隐藏的Debug工具拖出来调试一下,看看数据出现了什么变化?
对于某些只能在发布环境中出现的bug,借用Debug工具,比较容易发现问题。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 14:41 , Processed in 0.083001 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表