gpt4 book ai didi

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

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

我在 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 例程(内核32 内某处的 APPCRASH C00001A5)时崩溃。我已经通过在该调用周围放置 MessageBox 来确认这一点(try/except block )。

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

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

AQTime 为 8.22。

最佳答案

您可以检查默认情况下传递给分析进程的以下环境变量:AQTIME_DEBUGGER_PRESENTAQTIME_SESSION_IDAQTIME_VERSION

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

关于delphi - 检测到在 AQTime 下运行?避免调试代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384190/

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