I'm working on a class that I will use for my own debugging purposes. I intend it to be an on device version of the debugger console. Mostly I care about capturing NSLog() statements.
No matter what I log to the console, I'm only getting 0xFF from fgetc()
. What I expect to see from fgetc()
is a character that was sent to stderr since the last call to update
. Below is a subclass of UITextView:
stdErrFP
is defined in the header as: 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
has so many different log types, because Eric Sadun wrote that NSLog doesn't log to stderr, so i wanted to rule that out as a possibility. I'm not sure if this is related to my problem, but I noticed that fdopen()
always fails unless the flag is "w", this can't be right.
UPDATE: for fdopen()
I was wrong, it's not that only "w" works, it's that only "r" DOESN'T work. (i.e. both "a" and "w" work). The errno when I use "r" is: No such file or directory
. So it looks like I'm not properly connecting to stderr. StackOverflow Genius, please help.