我想在我们的自动化单元测试中添加内存泄漏检测.ReportMemoryLeaksOnShutdown将检测任何内存泄漏.最大的问题是它将结果打印到模态对话框,该对话框必须由用户手动关闭.这在构建服务器上运行的自动单元测试中不起作用.
有没有办法将ReportMemoryLeaksOnShutdown的输出重定向到其他地方?例如,将信息打印到文件?
doco说:
内存管理器将在关闭时扫描内存池,并在消息对话框中报告所有未注册的内存泄漏 .
我正在使用Delphi 2010
我正在使用JCLDebug在DUnit中显示堆栈跟踪(单击此处获取更多信息).请参阅下面的堆栈跟踪.
堆栈跟踪显示所有呼叫到函数调用导致错误的实际功能.ConvertScriptTestU的第238行调用另一个名为"GetDataLine"的函数(它从堆栈跟踪中丢失)然后调用IntToStr(它引发EConvertError).为什么堆栈跟踪不包含GetDataLine?
这个堆栈跟踪没那么有用,因为我仍然要弄清楚GetDataLine中的哪一行导致了EConvertError.
我在这里使用DUnit但是我看到在DUnit之外使用JclDebug时会发生同样的事情.
[答案]
只需将此行添加到项目文件中:
JCLdebug.JclStackTrackingOptions:=[stStack, stRawMode];
Run Code Online (Sandbox Code Playgroud)
它打开"原始模式".您可能还需要调整一些编译器选项(例如'生成堆栈帧')
[/答案]
TestConversion: EConvertError
at SysUtils:0 SysUtils.ConvertErrorFmt$00414A7E
'''' is not a valid integer value
StackTrace
[00414A79]{ConvertDataTests.exe} SysUtils.ConvertErrorFmt
[007E2699]{ConvertDataTests.exe} ConvertScriptTestU.ConvertDataTest.WriteDataToFile (Line 238, "ConvertDataTestU.pas")
[007E2198]{ConvertDataTests.exe} ConvertScriptTestU.ConvertDataTest.TestConversion (Line 164, "ConvertDataTestU.pas")
[0053C66E]{ConvertDataTests.exe} TestFramework.TTestCase.RunTest (Line 2380, "TestFrameWork.pas")
[00537DBA]{ConvertDataTests.exe} TestFramework.TTestResult.RunTestRun (Line 1199, "TestFrameWork.pas")
[00538078]{ConvertDataTests.exe} TestFramework.TTestResult.Run (Line 1275, "TestFrameWork.pas")
[0053963A]{ConvertDataTests.exe} TestFramework.TAbstractTest.RunWithFixture (Line 1723, "TestFrameWork.pas")
[0053C4DD]{ConvertDataTests.exe} TestFramework.TTestCase.RunWithFixture (Line 2363, "TestFrameWork.pas")
Run Code Online (Sandbox Code Playgroud) 我们有一个运行"svn update"的自动脚本.更新可能很大(100 + MB的二进制数据)
当脚本的先前实例仍在运行时,脚本可能会运行.
这会导致任何问题吗?"svn update"的第二个实例是否会意识到已经在同一目录上运行了另一个svn更新进程?如果是这样,它会做什么?
我们的应用程序需要很多我们编写的工具和实用程序来支持我们的产品。诸如数据转换器、备份实用程序等。目前,这些实用程序中的每一个都是一个单独的 Delphi 项目。最重要的是,这些项目中的许多项目也有相应的 DUnit 项目用于单元测试,这也必须是一个单独的项目。我们目前有 13 个独立的 Delphi 项目。这些项目都在一个项目组中。
这是必要的吗?我们是否必须有这么多独立的项目,或者在 Delphi 中有没有办法让多个入口点进入同一个项目?
此外,有时在开发过程中编写一些代码并“运行”它会很方便。为了做到这一点,我最终破解了项目文件;注释掉正常行为并将其替换为我想要运行的代码。这是唯一的方法吗?
如果有所不同,我们将使用 Delphi 2010。
这是泛型集合大师的问题.
我很震惊地发现TList没有覆盖等于.看看这个例子:
list1:=TList<String>.Create;
list2:=TList<String>.Create;
list1.Add('Test');
list2.Add('Test');
Result:=list1.Equals(list2);
Run Code Online (Sandbox Code Playgroud)
即使两个列表包含相同的数据,"结果"也是错误的.它使用默认的equals()(只比较两个引用的相等性).
查看代码,对于所有其他泛型集合类型看起来也是如此.
这是对的,还是我错过了什么?
如果在实践中尝试使用TLists,这似乎是一个大问题.我该如何解决这个问题?我是否创建了自己的TBetterList来扩展TList并覆盖等于做一些有用的事情?或者我会遇到Delphi泛型的进一步复杂化......?
[编辑:到目前为止我有一个答案,有很多赞成票,但它并没有真正告诉我我想知道什么.我会尝试改写这个问题]
在Java中,我可以这样做:
List<Person> list1=new ArrayList<Person>();
List<Person> list2=new ArrayList<Person>();
list1.add(person1);
list2.add(person1);
boolean result=list1.equals(list2);
Run Code Online (Sandbox Code Playgroud)
结果将是真的.我没有子类任何东西,它只是工作.
我怎样才能在Delphi中做同等的工作?
如果我在Delphi中编写相同的代码,结果将最终为false.
如果有一个解决方案只适用于TObjects而不是字符串或整数,那么这也是非常有用的.
我试图清理我继承的应用程序中的编译器警告.我们的一个类继承自TControl.我得到的警告是"改变的重新声明隐藏基类中的成员"
"已更改"是TControl中受保护的过程.我正在看的类已经用布尔属性覆盖了它
property Changed : Boolean read FChanged write FChanged stored true;
我已经排除了一些选项:
从"已更改"重命名为其他内容.这不是一个实用的选项,因为此属性在应用程序的任何位置都使用.
使用编译器指令隐藏警告.我可以这样做,但我更愿意找出警告的含义以及如何纠正它.
所以我的问题是:
1)这个警告真的有问题吗?"隐藏基础成员"有什么含义?
2)如何在不重命名属性或隐藏警告的情况下删除编译器警告?
我正在使用Delphi 2010
[编辑:有一些使用重构工具重命名违规财产的建议.我已经排除了这一点,因为重构工具在这个代码库上根本不起作用]