gpt4 book ai didi

delphi - 接收 WM_PAINT 后,VCL/comctl32.dll/USER32.dll/GDI32.dll 中偶尔出现 EAccessViolation

转载 作者:行者123 更新时间:2023-12-03 15:12:56 25 4
gpt4 key购买 nike

我需要一些关于调试 Delphi XE2 应用程序中的崩溃的建议。我自己从未见过这种崩溃——实际上这种情况很少发生,并且不能根据需要重现。

我们确实有来自 MadExcept 的一组 10 份崩溃报告。这些表明主线程当时正在主窗体的 ListView 中处理 WM_PAINT 消息。每种情况下的调用堆栈都没有显示对我自己的代码的引用,只有 VCL 代码和 comctl32.dll、ntdll.dll 和 USER32.dll 中的函数。

所涉及的 ListView 是 TColorListView,它派生自 TCustomListView,并处理 OnCustomDrawItem 和 OnDeletion 事件。但正如我所说,当崩溃发生时,我的 TColorListView 代码都不在调用堆栈上。

每种情况下崩溃的实际位置各不相同,但导致崩溃的调用顺序(从早到晚)始终是:

KiUserCallbackDispatcher
RtlAnsiStringToUnicodeString
StdWndProc
TWinControl.MainWndProc
TCustomListView.WndProc
TWinControl.WndProc
TControl.WndProc
TCustomListView.WMPaint
TWinControl.WMPaint
TWinControl.WMPaint
TWinControl.DefaultHandler
CallWindowProcA
TControl.WndProc

之后,它进入 StdWndProc/SendMessageW/TControl.Perform 之一,从那里开始,每次的路径都不同。最终它会出现在 comctl32.dll、USER32.dll、GDI32.dll 之一或只是 TControl.WndProc 中,并引发 EAccessViolation。遗憾的是,我不知道用户当时试图做什么,因为用户没有填写错误报告的这一部分。

您能否建议我使用任何“心理调试”技术来尝试确定此崩溃的原因(从而修复它)?

<小时/>

更新以回答以下评论中的问题:

procedure TColorListView.HandleCustomDrawItem(aSender: TCustomListView; aItem: TListItem;
aState: TCustomDrawState; var aDefaultDraw: Boolean);
begin
Canvas.Font.Color := ItemColors[aItem.Index];
end;

在(仅)一份崩溃报告中,它似乎进入了 TListItem.GetIndex 并进一步崩溃了几个堆栈帧。但这可能是转移注意力的事情。

“已执行”消息是什么?抱歉,我不知道。 MadExcept 没有给我方法参数值;只是方法名称。

<小时/>

5月31日

虽然我更愿意仅根据我所拥有的信息来查找故障,但我也欢迎对我可以添加到程序中的任何新诊断提出建议,以便如果在下一个版本后再次发生此崩溃,我将获得更多信息继续。但我很茫然,因为在崩溃时,我可以修改的代码甚至都不在调用堆栈上。

<小时/>

6月13日

我在 MadExcept 报告中添加了一行,告诉我发生异常时应用程序所处的状态 - 正在启动/事件/空闲/ModalDlg/终止。 (感谢 Chris Thornton 的评论建议。)我认为在关闭期间发生异常的可能性是合理的。不幸的是,直到 2014 年我们才发布新版本,并且有可能通过新诊断获取错误报告。

最佳答案

这只是一个猜测,但也许您面临着与我相同的问题(看起来相似)。
我的问题是在与创建不同的线程中销毁 WinAPI 窗口
在这种情况下,Windows 不会销毁窗口并返回错误,但某些 Delphi 组件只是忽略该错误,因此您最终会得到带有 WndProc 指向垃圾内存的挂起窗口(它将被 Delphi 释放)组件销毁,但窗口将保留)。
当此窗口尝试处理任何消息时,它将转到 WndProc(未定义)并导致带有 AV 的随机调用堆栈。

因此,请确保您在同一线程中创建和删除窗口(特别注意TTimer,它们也会创建窗口)

关于delphi - 接收 WM_PAINT 后,VCL/comctl32.dll/USER32.dll/GDI32.dll 中偶尔出现 EAccessViolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832842/

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