我usePerformance 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例程(kernel32内部某处的APPCRASH C00001A5 )时崩溃。我已经通过将MessageBoxes放在这个调用(尝试/除块)来确认这一点。
显然,IsDebuggerPresent在AQTime下运行时是真的,但是异常没有得到正确的处理。
问:我怎样才能发现和避免这种情况?如何检查代码是否在AQTime下执行?
AQTime为8.22。
发布于 2015-05-22 12:41:37
默认情况下,您可以检查传递给概要进程的下列环境变量:AQTIME_DEBUGGER_PRESENT、AQTIME_SESSION_ID和AQTIME_VERSION。
注意:确切的变量似乎取决于所使用的分析器(或AQTime版本?)-在我的例子中,只有AQTIME_SESSION_ID和AQTIME_VERSION存在。
https://stackoverflow.com/questions/30384190
复制相似问题