如何确定我是否在调试器下运行

2019/8/16 posted in  iOS
#include <assert.h>
#include <stdbool.h>
#include <sys / types.h>
#include <unistd.h>
#include <sys / sysctl.h>

static bool AmIBeingDebugged(void)
    //如果正在调试当前进程,则返回true(或者 
    //在调试器下运行或事后连接调试器)。
{
    int junk;
    你NEI [4];
    struct kinfo_proc info;
    size_t大小;

    //初始化标志,以便,如果sysctl失败了一些奇怪的事情 
    //原因,我们得到了可预测的结果。

    info.kp_proc.p_flag = 0;

    //初始化mib,在这种情况下告诉sysctl我们想要的信息
    //我们正在寻找有关特定进程ID的信息。

    mib [0] = CTL_KERN;
    mib [1] = KERN_PROC;
    mib [2] = KERN_PROC_PID;
    mib [3] = getpid();

    //调用sysctl。

    size = sizeof(info);
    junk = sysctl(mib,sizeof(mib)/ sizeof(* mib),&info,&size,NULL,0);
    断言(垃圾== 0);

    //如果设置了P_TRACED标志,我们正在调试。

    return((info.kp_proc.p_flag&P_TRACED)!= 0);
}

重要说明: 由于kinfo_proc结构(in )的定义是以条件为条件的__APPLE_API_UNSTABLE,因此您应该将上述代码的使用限制在程序的调试版本中。

参考 Detecting the Debugger