首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测运行在AQTime下?避免崩溃调试代码

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

Stack Overflow用户
提问于 2015-05-21 20:58:01
回答 1查看 358关注 0票数 3

我usePerformance Profiler在AQTime。尝试在IDE下运行它(使用Embarcadero RAD Studio XE)。在这些代码上检查的项目崩溃:

代码语言:javascript
复制
// 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例程(kernel32内部某处的APPCRASH C00001A5 )时崩溃。我已经通过将MessageBoxes放在这个调用(尝试/除块)来确认这一点。

显然,IsDebuggerPresent在AQTime下运行时是真的,但是异常没有得到正确的处理。

问:我怎样才能发现和避免这种情况?如何检查代码是否在AQTime下执行?

AQTime为8.22。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-22 12:41:37

默认情况下,您可以检查传递给概要进程的下列环境变量:AQTIME_DEBUGGER_PRESENTAQTIME_SESSION_IDAQTIME_VERSION

注意:确切的变量似乎取决于所使用的分析器(或AQTime版本?)-在我的例子中,只有AQTIME_SESSION_IDAQTIME_VERSION存在。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30384190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档