我遇到了一个问题,即每次启动时文件都会被删除,但我无法追踪到负责此问题的代码。最终,我将Vcl.Dialogs添加到所有单元中,并创建了一个初始化部分,其代码如下:
initialization
begin
ShowMessage('Inside [Unit Name Here]');
end;
这真是件麻烦事。有没有一种简单的方法按照它们触发的顺序生成表单/单元列表?
更新:2019-08-01(有用的 MAP 链接)
以下是两个链接,可能有助于理解 DELPHI map 文件:
我遇到了一个问题,即每次启动时文件都会被删除,但我无法追踪到负责此问题的代码。最终,我将Vcl.Dialogs添加到所有单元中,并创建了一个初始化部分,其代码如下:
initialization
begin
ShowMessage('Inside [Unit Name Here]');
end;
procedure InitUnits;
var
Count, I: Integer;
Table: PUnitEntryTable;
P: Pointer;
begin
if InitContext.InitTable = nil then
exit;
Count := InitContext.InitTable^.UnitCount;
I := 0;
Table := InitContext.InitTable^.UnitInfo;
[...]
try
while I < Count do
begin
P := Table^[I].Init;
Inc(I);
InitContext.InitCount := I;
if Assigned(P) then
begin
TProc(P)();
end;
end;
except
FinalizeUnits;
raise;
end;
end;
TProc(P)();
在循环之前检查Count的值;即使对于相对简单的项目,它的值可能高达几百。
在TProc(P)();行上设置断点,右键单击并将PassCount设置为Count值的一半。运行应用程序,当断点触发时,检查文件是否已被删除。
然后,您可以通过对Count的值进行二分搜索(如果文件仍然存在,则继续当前运行,或重置应用程序并将Pass Count减半)来确定确切地哪个单元会导致文件被删除。因为您可以使用二分搜索来完成这个过程,所以它将快速收敛到删除文件的单元。当断点触发时,您当然可以按下TProc(P)();上的F7键跟踪单元的初始化代码(如果已编译调试信息)。