一个很简单的情况。我正在开发 Delphi 2007 中的应用程序,该应用程序通常编译为“Release”,但仍在调试器下运行。偶尔它也会在 SilkTest 下运行,用于回归测试。虽然这很有趣,但我想做一些特别的事情......
我想检测我的应用程序是否在调试器/回归测试器中运行,如果是这种情况,我希望应用程序知道使用了哪个工具!(因此,当应用程序崩溃时,我可以在它的错误报告中报告此信息。)
有什么建议,解决方案吗?
一个很简单的情况。我正在开发 Delphi 2007 中的应用程序,该应用程序通常编译为“Release”,但仍在调试器下运行。偶尔它也会在 SilkTest 下运行,用于回归测试。虽然这很有趣,但我想做一些特别的事情......
我想检测我的应用程序是否在调试器/回归测试器中运行,如果是这种情况,我希望应用程序知道使用了哪个工具!(因此,当应用程序崩溃时,我可以在它的错误报告中报告此信息。)
有什么建议,解决方案吗?
您可以检查启动您的应用程序的父进程。使用CreateToolhelp32Snapshot
//获取应用程序 PID的父 PID(或Process32First
) 。然后获取父 PID 的文件名以与您要检查的应用程序进行比较,例如 SilkTest。Process32Next
PROCESSENTRY32.th32ParentProcessID
TProcessEntry32.th32ParentProcessID
查看本文以了解代码使用情况。
除了IsDebuggerPresent
and之外CheckRemoteDebuggerPresent
,还可以查询PEB.BeingDebugged
(PEB是Process Environment Block,要得到PEB必须查询TEB,也就是Thread Enviroment Block)。
您可能正在寻找该IsDebuggerPresent
功能。
要检测 SilkTest,您可以尝试附加到仅由 SilkTest 使用的 DLL 以检测其存在。例如,如果 Open Agent 附加到进程,Win32HookDll_x86.dll
或者将出现(使用Process ExplorerWin32HookDll_amd64.dll
之类的工具可以轻松找到名称。
你也可以做
if DebugHook <> 0 then ...