gpt4 book ai didi

delphi - 访问冲突 - 如何查找原因?

转载 作者:行者123 更新时间:2023-12-02 22:42:14 25 4
gpt4 key购买 nike

当我关闭应用程序中的表单时,出现访问冲突。这似乎只有在我访问数据库几次后才会发生,但这似乎没有意义。

我已追踪并将输出调试字符串消息放入所有相关的 OnDestroy() 方法中,但 AV 似乎位于我的代码之外。

这是消息的正文:

Access violation at address 00405F7C in module 'MySoopaApplication.exe'. Read of address 00000008.

如何找到 00405F7C 在应用程序中的位置?

Delphi 10.1 Berlin 中有哪些工具可以帮助我完成此任务?

编辑:添加了更多信息...单击“Break”时,IDE 总是将我带到 GETMEM.INC 中的这段代码:

@SmallPoolWasFull:
{Insert this as the first partially free pool for the block size}
mov ecx, TSmallBlockType[ebx].NextPartiallyFreePool

进一步编辑:嗯,我找到了罪魁祸首,尽管我不能诚实地说调试工具让我到达那里 - 它们似乎只是表明它不在我的代码中。

我使用了来自网络的代码来查找 Windows 登录用户 - 就是这样:

function GetThisComputerName: string;
var
CompName: PChar;
maxlen: cardinal;
begin
maxlen := MAX_COMPUTERNAME_LENGTH +1;
GetMem(CompName, maxlen);
try
GetComputerName(CompName, maxlen);
Result := CompName;
finally
FreeMem(CompName);
end;
end;

一旦我用一个简单的结果替换了代码:='12345',AV就停止了。我没有将其更改为以下代码:

function GetThisComputerName: string;
var
nSize: DWord;
CompName: PChar;
begin
nSize := 1024;
GetMem(CompName, nSize);
try
GetComputerName(CompName, nSize);
Result := CompName;
finally
FreeMem(CompName);
end;
end;

这似乎有效,并且作为奖励,不会导致 AV。

感谢您的帮助,非常感谢。

最佳答案

Tools|Options在 IDE 中转到 Embarcadero Debuggers | Language Exceptions并确保 Notify on Language Exceptions已检查。也在Project Options | Compiling下,确保Debugging | Use debug DCUs已选中。

允许异常发生,然后转到View | Debug Windows | Call stack你应该能够准确地看到它发生的位置。它发生在数据库访问之后的事实可能是因为这会导致创建一些对象,该对象在被销毁时会生成 AV。可能是因为它正在Free()编辑了两次。

如果这不能解决问题,您可能需要一个异常记录工具,例如 DavidH 提到的 madExcept。

Read of address 00000008.

事实上,这个地址是一个较小的数字,这表明它是一个对象成员的地址(因为它们通常与对象基地址的偏移量较小)。

How do I find where in the application 00405F7C is?

当您的应用程序运行时,在 IDE 中转到 Search | Go to Address 。如果异常是在您的应用程序中而不是在某些相关模块(例如它正在使用的 .DLL)中,则应该可以找到它。一旦应用程序在 IDE 中运行并在断点处停止,就会启用该菜单项。还有一个编译器命令行开关可以通过地址查找错误。

关于delphi - 访问冲突 - 如何查找原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37963203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com