使用 Progress 4GL 时,如何防止大量调试代码意外泄漏到生产环境中?
4 回答
我通常只是发布一个特殊事件——调试消息。在我的开发环境中,应用程序中有一个菜单项,它将启动一个窗口,该窗口可以在任何地方订阅调试消息并显示任何生成的消息。所以我可以在我的代码中插入调试消息,然后如果我想查看这些消息就打开窗口。如果我忘记整理调试代码,那么实时用户将看不到任何消息,尽管我仍然可以打开调试窗口来查看发生了什么。
(这个的 webspeed 版本只会将输出写入 OS 文件)
如果您的测试数据库和生产数据库具有不同的名称,您可以使用以下代码:
IF DBNNAME = "TESTDB" THEN
DO:
<DEBUG CODE>
END.
与我关于断言的其他答案类似,您可以设置一个包含在包含调试标志的生产站点上将为空的包含。在开发站点上,您只需要定义值,以便您的调试代码包含在您的程序中。
通过将代码包装在预处理器中,当您将其编译到生产站点上时,编译器将完全省略调试代码。
&if 定义(调试)<> 0 &then
&endif
You would then use the "&global-define debug" in versions of the code you want to contain the debug code. Not defining "debug" should cause the compiler to omit the code.
/* debug.i omit the following on production */
&GLOBAL-DEFINE DEBUGALERT
/* test.p */
{debug.i}
DEF VAR h_ct AS INT NO-UNDO
DO h_ct = 1 TO 10:
&IF DEFINED( DEBUGALERT ) <> 0 &THEN
MESSAGE "debug message" h_ct.
<debug code goes here>
&万一
结尾。
解决方案基于以下假设:开发环境具有唯一的 propath 条目,在其他环境中不可用,并且在移动时重新编译代码:
&IF DEFINED(DEBUGGING) = 0 &THEN
&IF PROPATH MATCHES '*development*' &THEN
&GLOBAL-DEFINE DEBUGGING TRUE
&ELSE
&GLOBAL-DEFINE DEBUGGING FALSE
&MESSAGE Remove debugging: search for DEBUG within the code.
&ENDIF
&ENDIF
&IF DEFINED(DEBUGGING_STARTED) = 0 &THEN
&GLOBAL-DEFINE DEBUGGING_STARTED TRUE
IF {&DEBUGGING} THEN
DO:
&ELSE
END.
&UNDEFINE DEBUGGING_STARTED
&ENDIF
用法
将文件作为“调试”(不带扩展名)保存到 propath 指向的目录,然后:
{debug}
/* some debugging code here */
{debug/}