我遇到了Win64调试问题,看起来我们"缺少"调试信息.所以我做了一些研究,并为我们的旗舰产品重新创建了所有的.dproj文件.这有助于我将"失踪"的蓝球带回来.
但是现在我遇到了一个新问题:堆栈显示窗口中显示的(顶部)堆栈框架看起来是错误的,这导致局部变量不显示在局部变量窗格中,并且当鼠标悬停在某个变量上方时也不会.但是当我选择我认为正确的堆栈帧时,局部变量窗口不再是空的.悬停鼠标仍然没有显示任何内容.
还要检查链接的屏幕截图,这应该更清楚地说明事情.
相关的编译器选项
版本信息:
我已经使用了许多调试设置组合,但问题仍然存在于我的系统上.
我的同事计算机在相同的代码中具有完全相同的问题,因此至少它可以自信地重现.当尝试使用带有运行时bpl的小项目重现此问题时,问题似乎不会发生,或者我无法重现它.因此,我没有任何来源可以释放.
当然,这是一个(是)问题: - 还有其他人经历过这个吗? - 找到了解决方案?- 请分享! - 没找到解决方案?- >请为此问题添加评论/投票
我想添加一些图片来澄清,但不幸的是我的声誉还不够高.所以我只能添加图片的链接,对不起.





背景
在 RS10.3 之前,我曾经使用 Andreas Hausladen DDevExtensions将我的项目源中的版本号设置为所有模块(bpl's/exe)都相同,但不幸的是,Andreas 已停止为 RS10.4 及更高版本更新他的工具。
因此,与使用 NotePad++ 对所有 dproj 文件应用多文件更改相比,我正在寻找更舒适的方法来在我的应用程序模块中设置版本号。
但是...另一方面,我确实希望保留特定于模块文件的特定信息(如文件描述等)。
我还要什么喜欢但是,这不是一个真正的要求是有我的(C)的通知,和其他共享信息,以在一个文件中(最好是.RC)也可集中进行。
从 dproj 文件中删除版本信息(无论如何维护起来都很痛苦)并为每个模块提供一个特定的 .rc 文件不是问题。
另一个优点是拥有一个中央版本号和 (c) 文件在 svn 更改管理中也好得多,因为我不必因为版本/内部版本号更改而提交每个 .dproj 文件。
调查
(随着我们的进行更新)我签出
但这些解决方案并不是我真正想要的。我不是在寻找脚本,而是寻找源文件/项目文件的方式来完成我的任务。
所以这是Q
我如何拥有一个包含我的版本号的.rc 文件并在其他包含特定版本信息的 .rc 文件中使用它
背景
我想创建一个单元测试来测试 Delphi 的一些 rtl 方面,为了做到这一点,我想使用我想直接从二进制表示创建的非常具体的 IEEE 浮点值。
到目前为止,我已经提出了这个例程,它实际上完成了这项工作。
function TestIEEEDouble.BuildDoubleFromRawInt64(const aBinData:UInt64):double;
begin
CheckEquals(sizeof(aBinData),sizeof(Result),'sizeof(aBinData),Sizeof(Result)'); // ensures we dont mess up with wrong types
Move(aBinData,Result,sizeof(Result));
end;
Run Code Online (Sandbox Code Playgroud)
它的用法如下(bindata 可能仍然是错误的,但这不是问题):
procedure TestIEEEDouble.Setup;
begin
inherited;
FSmallestPositiveDouble:=BuildDoubleFromRawInt64($0000000000000001);
FSmallestNegativeDouble:=BuildDoubleFromRawInt64($8000000000000001);
FLargestPositiveDouble :=BuildDoubleFromRawInt64($7FEFFFFFFFFFFFFF);
FLargestNegativeDouble :=BuildDoubleFromRawInt64($8FEFFFFFFFFFFFFF);
end;
Run Code Online (Sandbox Code Playgroud)
题
是否有允许const double直接从二进制(十六进制)表示创建一个看起来像这样的语法:
const
cSmallestPositiveDouble:double=double($0000000000000001);
Run Code Online (Sandbox Code Playgroud)
结果显然不应该是1.0(使用这种语法)但是(接近)4.94065645841247e-324
想象一下,我想在 VBA(伪代码)中执行类似的操作,并假设我有一个可枚举属性 IDList:
Dim MyObject object
set MyObject= CreateObject("MyObjectClass")
for each Item as integer in MyObject.IDList
Debug.Write(Cstr(Item) & ";")
Next
Run Code Online (Sandbox Code Playgroud)
我在德尔福的房产应该IDList是什么样子?仅仅从它派生出来IEnumerable<integer>或者IEnumerable似乎并不能完成这项工作。
基本代码
为了避免默认IENum和IEnum<T>接口的麻烦,我创建了自己的一组接口,用于在 Delphi 端进行枚举,以在对象 pascal 循环中使用for .. in .. 。
ISGEnumeratorBase= interface(IInterface)
['{DA91A203-3B39-4287-9A6F-6E9E4B184BAD}']
function MoveNext: Boolean;
end;
ISGEnumeratorReset = interface (ISGEnumeratorBase)
['{FBD2EFBD-D391-4BE2-A3AB-9C9D09197F78}']
procedure Reset;
end;
ISGEnumeratorClone = interface (ISGEnumeratorBase)
['{E3A128FD-7495-464D-BD5E-3EBA3AEFE94F}']
function Clone:ISGEnumeratorBase;
end;
/// <summary>
/// <para>
/// Required for implementing for..in loops
/// </para>
/// An alternative …Run Code Online (Sandbox Code Playgroud) 注意:请耐心等待,由于此处和此处的一些讨论以及我在此处和此处报告的一些问题,我感到有点“火爆”。
一些背景
Ye olde(10.4 之前)FreeAndNil看起来像这样:
FreeAndNil(var SomeObject)
Run Code Online (Sandbox Code Playgroud)
新的和新鲜的FreeAndNil看起来是这样的:
FreeAndNil(const [ref] SomeObject: TObject);
Run Code Online (Sandbox Code Playgroud)
IMO 都有其缺点:
FreeAndNil指针、记录和接口编译得很好,但在运行时会产生有趣但通常不需要的效果。(完全狂暴,或者如果幸运的话它会因 EAccessViolation、EInvalidOperation 等而停止。)FreeAndNil像这样调用新的:FreeAndNil(TObject.Create)它会编译甚至运行得很好。我喜欢FreeAndNil在我出错时警告我并提供例如属性而不是字段的旧版本。不确定如果为此FreeAndNil实现提供对象类型属性会发生什么。没试。如果我们将签名更改为 ,FreeAndNil(var SomeObject:TObject)那么它将不允许我们传递任何其他变量类型,然后正是该TObject类型。这也是有道理的,好像不是这样FreeAndNil,人们可以轻松地更改TComponent在例程中作为类型提供的变量,将 var 变量更改为完全不同类型的对象,例如TCollection. 当然FreeAndNil不会做这样的事情,因为它总是将 var 参数更改为 nil。
所以这是FreeAndNil一个特例。
甚至可能特别到足以说服 delphi 添加一个编译器魔术 FreeAndNil实现?投票给任何人?
潜在的解决方法 …
delphi memory-management object-lifetime rad-studio delphi-run-time-library
背景
我(相信)知道一个对象的地址,我想监视它。我通过首先选择调用堆栈上的一行(不是最上面的一行)然后查看局部变量来找到地址。那里有一个接口,说明接口名称和某个地址的实现类。地址似乎不正确,或者我显然做错了什么,因为对象的字段值似乎没有意义。以下面的图片为例。
问题 如何查看从本地堆栈中找到的对象字段?
delphi ×6
rad-studio ×4
debugging ×2
collections ×1
com ×1
ieee-754 ×1
ienumerator ×1
stack-frame ×1
vba ×1
watch ×1
win64 ×1