|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
[这个贴子最后由windyman在 2006/10/20 10:40am 第 1 次编辑]
[watermark]写一个程序容易,写一个正确的程序却不容易!很少有人拿到一个问题就能够完全正确的给出程序解答。既然错误难免,那就要学会如何找到错误,debug正是一个找错误的过程。
由于Fluent 的UDF被编译成了dll,并且cfd的计算中总是有大量的循环语句, 这无疑给debug带来了很大的困难,象普通的程序调试那样在vc++里设置断点就不大可行了。举例来说, 在fluent的DEFINE_SOURCE宏中, 如果你使用了某个非法(access violation)的指针,fluent不会告诉你错误出在这里, 只会提示说Error: access violation之类的废话;但是如果你在这个宏里加上Message之类的语句检查某个变量x的值的时候,你会发现Fluent的console屏幕输出的全是你debug的x变量值,你就只有“痴痴的等待”那崩溃的一刻到来吧。原因很简单, 在DEFINE_SOURCE宏中的代码, fluent会对每个cell都循环执行一遍, 所以才会让你如此痴痴的等。。。有人也许会觉得不用Message函数而把所有的debug信息写到某个logfile文件中,但马上会发现哪个logfile大得有几百M,甚至上G,windows几乎无法应付打开,如果你的计算问题很大的话。
最近本人在编写颗粒程序中总是在某个不确定的时间步(初始颗粒速度是随机给出的),计算颗粒速度程序出现了access violation, 由于涉及到大量颗粒,真让我伤透了脑筋(在颗粒少的情况下这个问题又不一定出现)。虽然困难, 问题还是需要解决。
针对上面的问题,本人想到的一个小技巧是: 先定义一些全局变量, 比如g_x, g_y, g_p等,这些变量类型与你要调试的变量类型一致,在需要调试的地方(比如DEFINE_SOURCE宏之类的地方),将你要调试变量x,y等的值赋给这些全局变量;在编写一个UDF宏DEFINE_ON_DEMAND,比如DEFINE_ON_DEMAND(Debug),在这个宏里面输出前面定义的全局变量,用Message或者是Logfile都可以; 一旦fluent崩溃后执行这个Debug命令, 这时候你就知道在出现错误的时候这些变量的值了。
上面的这个小方法几乎不浪费fluent执行时间,当然要耗费一点编写代码时间, 但是比起Message输出以及Log文件输出,效率高得多。
欢迎大家交流。本人Email: chunliangwu@gmail.com; QQ: 69065119[/watermark][br][br][以下内容由 windyman 在 2006年10月20日 10:39am 时添加] [br]
|
|