私は自分のデバッグ目的で使用するクラスに取り組んでいます。デバッガコンソールのデバイスバージョンにするつもりです。ほとんどの場合、NSLog()ステートメントのキャプチャに関心があります。コンソールに何をログインしても、からは0xFFしか取得できませんfgetc()
。私が期待してfgetc()
いるのは、の最後の呼び出し以降にstderrに送信された文字ですupdate
。以下はUITextViewのサブクラスです。
stdErrFP
ヘッダーで次のように定義されています。FILE* stdErrFP;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
stdErrFP = fdopen (fileno (stderr) , "w");
if (!stdErrFP)
NSLog(@"errno - %s", strerror(errno));
[self update];
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(makeSomeNoise) userInfo:nil repeats:YES];
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES];
}
return self;
}
-(void) update{
char errBuff[2] = {0x00, '\0'};
do{
errBuff[0] = fgetc(stdErrFP);
self.text = [NSString stringWithFormat:@"%@%@", self.text, [NSString stringWithCString:errBuff]];
}while (errBuff[0] != EOF);
}
-(void) makeSomeNoise{
CFShow([NSString stringWithString:@"noisy CFFunction"]);
NSLog(@"noisy NSLog");
char message[] = "noisy fprintf";
fprintf(stderr, message);
}
-(void)makeSomeNoise
Eric SadunがNSLogはstderrにログを記録しないと書いたので、非常に多くの異なるログタイプがあります。そのため、可能性としてそれを除外したいと思いました。これが私の問題に関連しているかどうかはわかりませんがfdopen()
、フラグが「w」でない限り常に失敗することに気付きました。これは正しくありません。
更新:fdopen()
私が間違っていたのは、「w」だけが機能するのではなく、「r」だけが機能しないということです。(つまり、「a」と「w」の両方が機能します)。「r」を使用した場合のerrnoは次のとおりNo such file or directory
です。そのため、stderrに正しく接続していないようです。StackOverflow Genius、助けてください。