小编H.H*_*ack的帖子

使用运行时库的Delphi 64位调试具有错误的堆栈帧活动

我遇到了Win64调试问题,看起来我们"缺少"调试信息.所以我做了一些研究,并为我们的旗舰产品重新创建了所有的.dproj文件.这有助于我将"失踪"的蓝球带回来.

但是现在我遇到了一个新问题:堆栈显示窗口中显示的(顶部)堆栈框架看起来是错误的,这导致局部变量不显示在局部变量窗格中,并且当鼠标悬停在某个变量上方时也不会.但是当我选择我认为正确的堆栈帧时,局部变量窗口不再是空的.悬停鼠标仍然没有显示任何内容.

还要检查链接的屏幕截图,这应该更清楚地说明事情.

相关的编译器选项

  • 调试信息:调试信息
  • 本地符号:正确
  • Stack Frames:真的
  • 符号参考信息:参考信息
  • 使用debug dcus:False
  • 使用导入的数据引用:True
  • 链接器调试信息:正确
  • 包括远程调试符号:False

版本信息:

  • RAD studio Enterprise 10.2.3 tokyo,build 25.0.29899.2631
  • 已安装DDevExtension,已安装IDEFixPack(卸载没有任何区别)
  • 安装JCLDebug(卸载没有区别)

我已经使用了许多调试设置组合,但问题仍然存在于我的系统上.

我的同事计算机在相同的代码中具有完全相同的问题,因此至少它可以自信地重现.当尝试使用带有运行时bpl的小项目重现此问题时,问题似乎不会发生,或者我无法重现它.因此,我没有任何来源可以释放.

当然,这是一个(是)问题: - 还有其他人经历过这个吗? - 找到了解决方案?- 请分享! - 没找到解决方案?- >请为此问题添加评论/投票

我想添加一些图片来澄清,但不幸的是我的声誉还不够高.所以我只能添加图片的链接,对不起.

  • 源代码视图中的断点
  • 完整CPU视图中的断点
  • 选择子顶部堆栈帧
  • 甚至连一个更深,意想不到的堆叠顶部
  • 上一条指令导致堆栈显示被破坏

delphi debugging win64 watch stack-frame

7
推荐指数
1
解决办法
415
查看次数

Delphi 版本号集中但其他信息分散

背景

在 RS10.3 之前,我曾经使用 Andreas Hausladen DDevExtensions将我的项目源中的版本号设置为所有模块(bpl's/exe)都相同,但不幸的是,Andreas 已停止为 RS10.4 及更高版本更新他的工具。

因此,与使用 NotePad++ 对所有 dproj 文件应用多文件更改相比,我正在寻找更舒适的方法来在我的应用程序模块中设置版本号。

但是...另一方面,我确实希望保留特定于模块文件的特定信息(如文件描述等)。

我还要什么喜欢但是,这不是一个真正的要求是有我的(C)的通知,和其他共享信息,以在一个文件中(最好是.RC)也可集中进行。

从 dproj 文件中删除版本信息(无论如何维护起来都很痛苦)并为每个模块提供一个特定的 .rc 文件不是问题。

另一个优点是拥有一个中央版本号和 (c) 文件在 svn 更改管理中也好得多,因为我不必因为版本/内部版本号更改而提交每个 .dproj 文件。

调查

(随着我们的进行更新)我签出

但这些解决方案并不是我真正想要的。我不是在寻找脚本,而是寻找源文件/项目文件的方式来完成我的任务。

所以这是Q

我如何拥有一个包含我的版本号的.rc 文件并在其他包含特定版本信息的 .rc 文件中使用它

delphi resource-files fileversioninfo rad-studio

7
推荐指数
1
解决办法
249
查看次数

Delphi:从二进制表示中定义 const double

背景

我想创建一个单元测试来测试 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

delphi type-conversion ieee-754 rad-studio

6
推荐指数
2
解决办法
159
查看次数

我需要实现什么接口才能允许 VBA 中的 ForEach 作用于用 delphi 编写的 COM 对象?

想象一下,我想在 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似乎并不能完成这项工作。

基本代码

为了避免默认IENumIEnum<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)

delphi com collections ienumerator vba

5
推荐指数
1
解决办法
482
查看次数

Delphi FreeAndNil:寻找替代实现

注意:请耐心等待,由于此处此处的一些讨论以及我在此处此处报告的一些问题,我感到有点“火爆”

一些背景

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 等而停止。)
  • 新的接受一个 const 参数,因此任何对象。但是随后提供的对象指针实际上是使用一些古怪的代码更改的。
  • 你现在可以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

4
推荐指数
1
解决办法
813
查看次数

如何在特定(绝对)地址检查/观察对象

背景

我(相信)知道一个对象的地址,我想监视它。我通过首先选择调用堆栈上的一行(不是最上面的一行)然后查看局部变量来找到地址。那里有一个接口,说明接口名称和某个地址的实现类。地址似乎不正确,或者我显然做错了什么,因为对象的字段值似乎没有意义。以下面的图片为例。

在此处输入图片说明

问题 如何查看从本地堆栈中找到的对象字段?

delphi debugging rad-studio

1
推荐指数
1
解决办法
99
查看次数