我正在研究一個我將用於自己的調試目的的類。我打算將它作爲調試器控制檯的設備版本。我主要關心捕獲NSLog()語句。 無論我登錄到控制檯,我只從fgetc()
獲得0xFF。我期待從fgetc()
看到的是自上次致電update
以來發送給stderr的角色。下面是UITextView中的一個子類:定期從iPhone讀取stderr
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 wrote that NSLog doesn't log to stderr,所以我想排除這種可能性的可能性。我不確定這是否與我的問題有關,但我注意到fdopen()
總是失敗,除非該標誌是「w」,這不可能是正確的。
更新:對於fdopen()
我錯了,它不是隻有「W」的作品,而是隻有「R」不起作用。 (即「a」和「w」都起作用)。當我使用「r」時,errno是:No such file or directory
。所以看起來我沒有正確連接到stderr。 StackOverflow Genius,請幫忙。