views:

67

answers:

1

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.

A: 

As best I can code, you can not read from stderr. The stderr buffer is like a firehose, trying to grab anything meaningful is very time dependent.

SooDesuNe