Я работаю над классом, который буду использовать для своих собственных целей отладки. Я предполагаю, что это будет версия устройства консоли отладчика. В основном я забочусь о захвате операторов 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
имеет так много разных типов журналов, потому что Эрик Садун писал, что NSLog не регистрирует в stderr , поэтому я хотел исключить это как возможность. Я не уверен, связано ли это с моей проблемой, но я заметил, что fdopen()
всегда терпит неудачу, если только флаг не равен "w", это не может быть правильным.
ОБНОВЛЕНИЕ: для fdopen()
Я был не прав, дело не в том, что работает только "w", а в том, что только "r" НЕ работает. (т. е. оба «а» и «ш» работают). Ошибка, когда я использую «r»: No such file or directory
. Похоже, я неправильно подключаюсь к stderr. StackOverflow Genius, пожалуйста, помогите.