【问题标题】:Delphi XE4 64bit _TExitDllExceptionDelphi XE4 64bit _TExitDllException
【发布时间】:2014-03-13 16:39:00
【问题描述】:

基于 COM 技术的项目。 我在 Delphi XE4 64Bit 上记录了 JCL 的错误(SKGeneral64 是 COM Dll):

ERR (ThreadID=14C8 14.02.2014 16:43:14:274) - Exception class: _TExitDllException
Exception address: 000000000536DBAE
Stack list, generated 14.02.2014 16:43:14
[000000000536DBAE] System.ExitDll + $3E
[000000000536DCF4] System.@Halt0 + $54
[000000000536D5E3] System.@StartLib + $123
[0000000005375FA2] SysInit.@InitLib + $92
[00000000056D7938] SKGeneral64.SKGeneral64 + $38
[000000007777C76C] Unknown function at RtlUserThreadStart + $26C
[000000007777C42F] Unknown function at LdrInitializeThunk + $10F
[000000007777C32E] LdrInitializeThunk + $E
----------------------------------------------------------------------------------------------------
System   : Windows 7 Professional, Version: 6.1, Build: 1DB1, "Service Pack 1"
Processor: Intel, Intel(R) Xeon(R) CPU           X5670  @ 2.93GHz, 2960 MHz MMX
----------------------------------------------------------------------------------------------------
Module: C:\PROGRA~2\SKBKON~1\Active\Bin\SKGENE~2.DLL   Modified: 14.02.2014 16:42:37
Version: 1.0.0.0  Description: 

这是什么原因?这可能是内存泄漏和内存碎片的原因吗?

【问题讨论】:

  • 不看代码很难说?
  • @whosrdaddy 稍后会做示例,并将在 cmets 中写给您

标签: delphi delphi-xe4


【解决方案1】:

经过一番挖掘,似乎这个异常是预期的,并且是线程终止时线程返回其退出代码的方式。

事情是这样的。向System.ExitDll 拨打电话:

procedure ExitDll(Context: PInitContext);
var
  ResultExitCode: Integer;
begin
  Context^ := Context.OuterContext^;
  ResultExitCode := ExitCode;
  ExitCode := 0;
  //raise _TExitDllException.Create(ResultExitCode);
  _RaiseExcept(_TExitDllException.Create(ResultExitCode));
end;

这就是引发异常的原因。异常处理在_HandleExitDllException

function _HandleExitDllException: Integer;
var
  ExceptionObject: TObject;
begin
  Result := -1;
  ExceptionObject := ExceptObject;
  if ExceptionObject is _TExitDllException then
    Result := _TExitDllException(ExceptionObject).ExitCode
  else
    _UnhandledException;
  _DoneExcept;
end;

此代码从异常中读取退出代码并将该值返回给调用者。您在 RTL 中看不到任何调用 _HandleExitDllException 的代码,可能是因为编译器/链接器神奇地链接了它。

本质上这是您的错误报告软件的误报。此异常是正常程序执行的一部分。没有什么可担心的。除了您的错误报告代码似乎有缺陷。

【讨论】:

  • 会不会是这样的内存泄漏? link
  • 为什么你认为这是泄漏?我的猜测是您的错误报告软件有缺陷。我是 madexcept 的粉丝。
  • 在您问的问题中:可能是内存泄漏和内存碎片的原因吗? 什么内存泄漏?什么碎片化?
  • 我的应用程序没有报告内存泄漏(使用 FastMM4)。但是程序的内存使用量仍在增长(每天大约 50-100mb)。我想可能是这样的原因Link to Stackoverflow泄漏->碎片
  • 你如何衡量?
猜你喜欢
  • 2013-05-09
  • 2013-11-04
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多