【问题标题】:Any way to tell if my iPhone app is running under the debugger at runtime?有什么方法可以判断我的 iPhone 应用程序是否在运行时在调试器下运行?
【发布时间】:2009-02-13 17:38:13
【问题描述】:

如果我的错误处理代码在调试器下运行,我希望它的行为有所不同。具体来说,如果我在手机上运行,​​没有连接到调试器并且断言失败,我想将错误发送到我的服务器。当我在gdb下时,我想闯入调试器。

虽然我可以想象 Apple 会如何编写代码,但我找不到任何关于运行时方式的文档来测试是否存在调试器。

【问题讨论】:

    标签: iphone xcode debugging macos gdb


    【解决方案1】:

    here 描述的方法对我来说效果很好

    我把它放在-(void)viewDidLoad测试

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        int mib[4];
        size_t bufSize = 0;
        int local_error = 0;
        struct kinfo_proc kp;
    
        mib[0] = CTL_KERN;
        mib[1] = KERN_PROC;
        mib[2] = KERN_PROC_PID;
        mib[3] = getpid();
    
        bufSize = sizeof (kp);
        if ((local_error = sysctl(mib, 4, &kp, &bufSize, NULL, 0)) < 0) {
            label.text = @"Failure calling sysctl";
            return;
        }
        if (kp.kp_proc.p_flag & P_TRACED)
            label.text = @"I am traced";
        else
            label.text = @"I am not traced";
    }
    

    【讨论】:

      【解决方案2】:

      为什么不重新定义断言来做你想做的事,而不是为调试而编译?

      另一种选择是创建自己的断言函数,然后可以在加载到 GDB 时添加断点。

      断言原型是

      void 断言(int 表达式);

      void assert(int expression)
      {
          if( !expression )
          {
             // enable break point here
             // log to server
          }
      }
      

      或将断点添加到服务器代码的日志中。

      【讨论】:

      • 我仍然希望它在调试器下表现不同 - 这不仅仅是调试版本,我希望在附加 gdb 时表现不同。
      • 您是否打算使用调试符号进行分发?否则,没有调试/发布版本毫无意义。如果您试图保护应用程序免受调试器的影响,那就完全是另一回事了:P。
      猜你喜欢
      • 2011-11-14
      • 2014-10-26
      • 2012-03-28
      • 2013-06-15
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多