123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #include "catch_debugger.h"
- #include "catch_errno_guard.h"
- #include "catch_stream.h"
- #include "catch_platform.h"
- #if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
- # include <cassert>
- # include <sys/types.h>
- # include <unistd.h>
- # include <cstddef>
- # include <ostream>
- #ifdef __apple_build_version__
-
-
- # include <sys/sysctl.h>
- #endif
- namespace Catch {
- #ifdef __apple_build_version__
-
-
-
-
- bool isDebuggerActive(){
- int mib[4];
- struct kinfo_proc info;
- std::size_t size;
-
-
- info.kp_proc.p_flag = 0;
-
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = getpid();
-
- size = sizeof(info);
- if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) {
- Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl;
- return false;
- }
-
- return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
- }
- #else
- bool isDebuggerActive() {
-
- return false;
- }
- #endif
- }
- #elif defined(CATCH_PLATFORM_LINUX)
- #include <fstream>
- #include <string>
- namespace Catch{
-
-
-
-
-
-
-
- bool isDebuggerActive(){
-
-
- ErrnoGuard guard;
- std::ifstream in("/proc/self/status");
- for( std::string line; std::getline(in, line); ) {
- static const int PREFIX_LEN = 11;
- if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) {
-
-
-
- return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
- }
- }
- return false;
- }
- }
- #elif defined(_MSC_VER)
- extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
- namespace Catch {
- bool isDebuggerActive() {
- return IsDebuggerPresent() != 0;
- }
- }
- #elif defined(__MINGW32__)
- extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
- namespace Catch {
- bool isDebuggerActive() {
- return IsDebuggerPresent() != 0;
- }
- }
- #else
- namespace Catch {
- bool isDebuggerActive() { return false; }
- }
- #endif
|