0

私は自分のデバッグ目的で使用するクラスに取り組んでいます。デバッガコンソールのデバイスバージョンにするつもりです。ほとんどの場合、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)makeSomeNoiseEric SadunがNSLogはstderrにログを記録しないと書いたので、非常に多くの異なるログタイプがあります。そのため、可能性としてそれを除外したいと思いました。これが私の問題に関連しているかどうかはわかりませんがfdopen()、フラグが「w」でない限り常に失敗することに気付きました。これは正しくありません。

更新:fdopen()私が間違っていたのは、「w」だけが機能するのではなく、「r」だけが機能しないということです。(つまり、「a」と「w」の両方が機能します)。「r」を使用した場合のerrnoは次のとおりNo such file or directoryです。そのため、stderrに正しく接続していないようです。StackOverflow Genius、助けてください。

4

1 に答える 1

0

私がコーディングできる最善の方法として、stderrから読み取ることはできません。stderrバッファーは消防ホースのようなもので、意味のあるものを取得しようとすると、時間に大きく依存します。

于 2010-07-16T02:52:23.773 に答える