Обнаружить работу под AQTime? Избегайте сбоев кода отладки

Я использую Performance Profiler в AQTime. Попытка запустить его под 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;

Он отлично работает при запуске вне среды IDE (в этом случае подпрограмма будет завершена без каких-либо действий) или при запуске в обычном отладчике среды IDE (в этом случае подпрограмма вызовет исключение, которое будет обрабатываться отладчиком IDE).

Однако при запуске в AQTime подпрограмма завершится сбоем прямо при вызове подпрограммы kernel32.RaiseException (APPCRASH C00001A5 где-то внутри kernel32). Я подтвердил это, поместив MessageBoxes вокруг этого вызова (попробуйте / исключите блок).

Очевидно, IsDebuggerPresent имеет значение True при запуске под AQTime, но исключение не обрабатывается должным образом.

Вопрос: как я могу обнаружить и избежать этого? Как я могу проверить, выполняется ли код в AQTime?

AQTime 8,22.

1 ответ

Решение

Вы можете проверить следующие переменные среды, которые по умолчанию передаются профилированному процессу: AQTIME_DEBUGGER_PRESENT, AQTIME_SESSION_ID а также AQTIME_VERSION,

Примечание: точные переменные зависят от используемого профилировщика (или версии AQTime?) - только в моем случае AQTIME_SESSION_ID а также AQTIME_VERSION присутствуют.

Другие вопросы по тегам