随着关于Delphi团队致力于跨平台开发的所有讨论,一种不断涌现的情绪是,"我希望他们这次做得对,不像Kylix." 我没有真正注意到Kylix何时出现,因为当时Linux并不像现在那样成熟,而且它不是我感兴趣的操作系统.所以现在它又开始成为一个问题,我发现自己在想,Kylix做错了什么,这次CodeGear怎么能做得更好呢?
我正在为 CLR 开发一个编译器,并且大部分情况下它都能工作。我正在尝试生成调试信息,并且可以让它在生成的程序集中创建一个嵌入式 PDB,其中所有调试元数据看起来都是正确的。当我加载程序集时,模块视图显示“符号已加载”。但我无法让调试器识别断点,如果我在代码中抛出异常,它会说:
来源不可用
该模块的调试信息中缺少源信息。
当我在 DotPeek 中查看程序集时,它并没有在程序集的主名称行上显示“调试”,这与使用调试信息构建的 C# 程序集的做法不同。但我不确定缺少什么。
什么会导致出现此错误?如果有人需要查看测试用例,这里有一个。
编辑:请阅读问题并记下标签。我在这里得到了几个不同的答案,它们是标准的“如何在正常情况下加载 PDB”答案。 这个问题与正常情况无关。 我正在构建编译器,它生成了不正确的 PDB。我需要一种方法来调试我自己生成的 PDB 代码的输出。
compiler-construction code-generation visual-studio pdb-files .net-core
我有一个TDbGrid,我可以很容易地告诉它在运行时有多少列使用FieldCount属性,但似乎没有相应的RowCount属性来显示正在显示的记录数.我怎么能找到这个?
我听说一些自定义组件作者使用RTL例程来检查Delphi是否正在运行以设置共享软件限制.有谁知道这个例程是什么?检查诸如"DelphiRunning"或"IsDelphiRunning"之类的明显名称并没有发现任何有用的东西.
GetMem允许您分配任意大小的缓冲区.在某处,大小信息由内存管理器保留,因为当您将指针传递给FreeMem时,不需要告诉它缓冲区有多大.
该信息仅供内部使用,还是有任何方法可以检索指针指向的缓冲区大小?
我正在将Delphi 5应用程序移植到D2010,我遇到了一些问题.在一个窗体上是一个带有OnMouseMove事件的TImage组件,当鼠标移动到图像上时,该事件应该更新标签.这在原始应用程序中运行得很好,但是现在OnMouseMove事件会在鼠标悬停在图像上时不断触发,无论它是否在移动,这会导致标签闪烁可怕.
有谁知道造成这种情况的原因以及如何解决这个问题?
在Delphi中,考虑一下
var
i: integer;
begin
for i := 0 to N do
begin
{ Code }
end;
Run Code Online (Sandbox Code Playgroud)
有人可能会认为,i = N在后for循环,但确实在Delphi编译器保证这一点?在Delphi if循环之后,可以假设循环变量等于循环内的最后一个值吗?
更新
在尝试了几个简单的循环之后,我怀疑它i实际上等于一个加上i循环后循环内部的最后一个值 ...但是你能依靠这个吗?
将代码从Delphi 7转换到2010时,我遇到了一个奇怪的问题.它与记录有关.下面定义的记录,在D7中的大小为432字节,在D2009(和2010年)中为496.我知道,一个简单的解决方案是使其成为打包记录,然后所有版本都达到426字节......但是,我们将数据存储在我们流式传输记录的位置,现在我们正在尝试使用更新的语言读取这些流.
TToTry = Record
a,b,c,d : Extended;
e,f,g,h : Extended;
i : String[15];
j,k,l,m,n,o,p,q,r,s,t : Array[1..3] of Extended; End;
Run Code Online (Sandbox Code Playgroud)
在调查这个问题时,我创建了另一条记录,无论出于何种原因,大小都相同?记录较小,但它具有相同的数据类型.但它在所有版本的语言中都有相同的大小.
TMyRecord = Record
Ext1 : Extended;
Ext2 : Extended;
Ext3 : Extended;
Ext4 : Extended;
Ext5 : Extended;
Ext6 : Extended;
Int1 : Integer;
Int2 : Integer;
char1 : AnsiChar;
char2 : AnsiChar;
MyString : String[15];
Arr1 : Array[1..3] of Extended;
Arr2 : Array[1..3] of Extended; end;
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么一个记录如此不同,另一个是相同的?与Delphi中的字节边界对齐有关.但是从一个版本到下一个版本的变化如此之大?
如果你在Delphi内部进行足够的搜索,你会发现一些奇怪的东西,并且显然没有记录编译器生成的TTypeInfo记录.如果PTypeInfo指向地址X处的TTypeInfo记录,X - 4那么您将发现接下来的4个字节描述了指向X的指针.例如:
procedure test(info: PTypeInfo);
var
addr: cardinal;
ptr: PPointer;
begin
addr := cardinal(info);
writeln('addr: ', addr);
dec(addr, 4);
ptr := PPointer(addr);
addr := cardinal(ptr^);
writeln('addr: ', addr);
end;
Run Code Online (Sandbox Code Playgroud)
将编译器生成的任何合法的PTypeInfo传递给此例程,并且它将输出相同的地址两次.我在TypInfo.pas中略微探讨了一下,但是我没有看到任何提到这个"身份指针"的东西或它的用途.有谁知道为什么会这样?对于从至少D3到D2010的每个版本的Delphi,这似乎都是正确的.
我正在尝试构建一个包含DWS编译器的包(包A).它工作,但当我有一个第二个包(包B),需要包A,包含任何使用 DWS特定单位的单位,我得到错误:
[DCC致命错误] E2225永不建立包'包A'必须重新编译
如果我将包A更改为按需重新编译,则错误不会消失.我反而得到了
[DCC致命错误] F2084内部错误:U10346
在同一点上.
我在http://code.google.com/p/dwscript/issues/detail?id=419上发布了一个错误报告,看起来问题在作者端无法重现,这意味着我的问题出现了问题.结束.他提出了一些有用的建议:"我有时会因为流浪的DCU而看到这个错误."
即使在重新启动IDE和计算机之后,搜索和删除可能相关的所有DCU也无法解决问题.
在编译过程中使用Process Monitor在BDS上运行跟踪并未显示任何看起来相关的内容.
有没有人对如何追踪这个有任何想法?使用Delphi XE,更新1.
交叉发布到Delphi论坛.让我们先看看谁提出了解决方案.
delphi ×9
delphi-2010 ×2
pointers ×2
.net-core ×1
bpl ×1
datagrid ×1
delphi-2009 ×1
delphi-xe ×1
for-loop ×1
internals ×1
onmousemove ×1
pdb-files ×1
record ×1
rtti ×1
variables ×1