很简单的情况。我正在使用Delphi 2007开发一个应用程序,通常编译为“Release”版本,但仍在调试器下运行。有时它还会在SilkTest下运行,用于回归测试。虽然这非常有趣,但我想做一些特殊的事情...
我想检测我的应用程序是否在调试器/回归测试工具中运行,如果是这样,我希望应用程序知道使用的是哪个工具!(因此,当应用程序崩溃时,我可以在错误报告中报告此信息。)
有什么建议或解决方案吗?
很简单的情况。我正在使用Delphi 2007开发一个应用程序,通常编译为“Release”版本,但仍在调试器下运行。有时它还会在SilkTest下运行,用于回归测试。虽然这非常有趣,但我想做一些特殊的事情...
我想检测我的应用程序是否在调试器/回归测试工具中运行,如果是这样,我希望应用程序知道使用的是哪个工具!(因此,当应用程序崩溃时,我可以在错误报告中报告此信息。)
有什么建议或解决方案吗?
CreateToolhelp32Snapshot
/Process32First
/Process32Next
获取你的应用程序 PID 的父 PID (PROCESSENTRY32.th32ParentProcessID
或 TProcessEntry32.th32ParentProcessID
)。然后获取父 PID 的文件名以与你想要检查的应用程序进行比较,例如 SilkTest。IsDebuggerPresent
和 CheckRemoteDebuggerPresent
之外,你还可以查询 PEB.BeingDebugged
(PEB 是进程环境块,要获取 PEB,必须查询 TEB,即线程环境块)。IsDebuggerPresent
函数。CheckRemoteDebuggerPresent
的函数,听起来像是可以识别远程调试器。我不熟悉SilkTest,所以不知道它是否充当调试器。如果是,那么上面的方法就可以奏效。如果不是,那么你需要找到另一种技术。 - Greg Hewgill为了检测SilkTest,您可以尝试附加到仅由SilkTest使用的DLL以便检测其存在。例如,如果打开代理附加到一个进程中,Win32HookDll_x86.dll
或Win32HookDll_amd64.dll
将会存在(这些名称可以使用像Process Explorer这样的工具轻松找到)。
你也可以这样做
if DebugHook <> 0 then ...