检测AQTime下运行?避免崩溃调试代码

Ale*_*lex 3 delphi aqtime

我在AQTime中使用了Performance Profiler.尝试在IDE下运行它(使用Embarcadero RAD Studio XE).检查过这些代码的项目崩溃:

// Setting a Thread Name (Unmanaged):
// http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.71).aspx
procedure _NameThreadForDebugging(const ATID: Cardinal; const AThreadName: String);
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PAnsiChar;    // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
var
  ThreadNameInfo: TThreadNameInfo;
  ThreadName: AnsiString;
begin
  // Applicable only for debugged applications
  if IsDebuggerPresent then
  begin
    FillChar(ThreadNameInfo, SizeOf(ThreadNameInfo), 0);

    ThreadName := AnsiString(AThreadName);
    ThreadNameInfo.FType := $1000;
    ThreadNameInfo.FName := PAnsiChar(ThreadName);
    ThreadNameInfo.FThreadID := ATID;

    try
      RaiseException(cSetThreadNameExcep, 0, SizeOf(ThreadNameInfo) div SizeOf(LongWord), @ThreadNameInfo);
    except
    end;
    Finalize(ThreadName);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

它在IDE之外运行时运行正常(在这种情况下,例程将在不执行任何操作的情况下退出),或者在通常的IDE调试器下运行时(在这种情况下,例程将引发异常,这将由IDE的调试器处理).

但是,在AQTime下运行时 - 例程将在调用kernel32.RaiseException例程(在kernel32内某处的APPCRASH C00001A5)时崩溃.我通过在此调用周围放置MessageBoxes来确认这一点(try/except块).

显然,在AQTime下运行时,IsDebuggerPresent为True,但未正确处理异常.

问题:如何检测并避免这种情况?如何检查代码是否在AQTime下执行?

AQTime是8.22.

Ale*_*lex 6

您可以检查默认情况下传递给异型过程以下环境变量:AQTIME_DEBUGGER_PRESENT,AQTIME_SESSION_IDAQTIME_VERSION.

注意:确切的变量似乎取决于使用的探查器(或AQTime版本?) - 仅在我的情况下AQTIME_SESSION_ID并且AQTIME_VERSION存在.