デバッガーで実行している場合、エラー処理コードの動作を変更したいと考えています。具体的には、デバッガーに接続されていないハンドセットで実行していて、アサーションに失敗した場合、サーバーにエラーを送信したいと考えています。gdb の下にいるときに、デバッガーに侵入したいと考えています。
Apple がどのようにコードを作成するかは想像できますが、デバッガーの存在をテストする実行時の方法に関するドキュメントは見つかりません。
ここで説明されている方法は私にとってはうまくいきました
入れてテストしました-(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";
}
デバッグ用にコンパイルされていないときに、assert を再定義して、やりたいことを実行してみませんか?
別のオプションは、独自のアサート関数を作成することです。これにより、GDB へのロード時にブレークポイントを追加できます。
アサートのプロトタイプは
void assert(int 式);
void assert(int expression)
{
if( !expression )
{
// enable break point here
// log to server
}
}
またはサーバー コードのログにブレーク ポイントを追加します。