2012-04-11 6 views
2

私は最近、リリースビルド(スキームの管理とデバッグからリリースの実行の設定)を使用してアプリケーションのテストを開始しました。私が気づいたことは時々、ストリームメソッドの中に次のエラーポップアップが表示され、エラーを見つける方法を見つけることができないことがあることです。これは完全にデバッグモードで動作しますが、リリースビルドではSIGABRTメッセージ以外の通知はありません。また、シミュレータのクラッシュログをチェックして、問題の内容を確認する方法についても認識していません。ストリームからストリームの最適化のために値が一時的に利用できません

#0 0x918749c6 in __pthread_kill() 
#1 0x916c0f78 in pthread_kill() 
#2 0x916b1ce3 in __abort() 
#3 0x916ae64a in __stack_chk_fail() 
#4 0x00006d0d in -[MainViewController processMessage:len:] (_cmd=0x9ceb9, msg=0xdfd7004 "Login="User" Pass="Pass" Id="1234" PlayerId="345" Location="12,35" Color="Red" PlayerId="65" Location="180,0" Color="Blue" PlayerId="29" Location="0,200" Color="..., len=333295) at /Users/seb/Desktop/Tutorials/Networking/MainViewController.m:850 
#5 0x000044b3 in -[MainViewController stream:handleEvent:] (_cmd=0x17a0410, stream=<value temporarily unavailable, due to optimizations>, eventCode=<value temporarily unavailable, due to optimizations>) at /Users/seb/Desktop/Tutorials/Networking/MainViewController.m:260 
#6 0x01716501 in _inputStreamCallbackFunc() 
#7 0x016e606d in _signalEventSync() 
#8 0x016e67ca in _cfstream_solo_signalEventSync() 
#9 0x016e5e71 in _CFStreamSignalEvent() 
#10 0x016e6727 in CFReadStreamSignalEvent() 
#11 0x020083ad in SocketStream::dispatchSignalFromSocketCallbackUnlocked() 
#12 0x01f64191 in SocketStream::socketCallback() 
#13 0x01f640a1 in SocketStream::_SocketCallBack_stream() 
#14 0x016b3e44 in __CFSocketPerformV0() 
#15 0x0171997f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__() 
#16 0x0167cb73 in __CFRunLoopDoSources0() 
#17 0x0167c454 in __CFRunLoopRun() 
#18 0x0167bdb4 in CFRunLoopRunSpecific() 
#19 0x0167bccb in CFRunLoopRunInMode() 
#20 0x0226f879 in GSEventRunModal() 
#21 0x0226f93e in GSEventRun() 
#22 0x0066aa9b in UIApplicationMain() 
#23 0x0000201b in main (argc=1, argv=0xbffff5e0) at /Users/seb/Desktop/Tutorials/Networking/main.m:14 

Caseステートメント:クラッシュが発生した場所でのhandleEvent:

case NSStreamEventHasBytesAvailable: 
     { 
      if (stream == inputStream) 
      { 
       NSLog(@"NSStreamEventHasBytesAvailable"); 

       uint8_t buffer[4096]; 
       unsigned int len = 0; 
       NSInputStream* inputstream = (NSInputStream*)stream; 
       len = [inputstream read:buffer maxLength:sizeof(buffer)]; 

       // Check if our stream is still valid 
       if([inputstream streamError] != nil) 
       { 
        //We lost our connection to the host 
        NSError *theError = [stream streamError]; 
        [self setConnectError:[NSString stringWithFormat:@"Error %i: %@", 
                  [theError code], [theError localizedDescription]]]; 

        break; 
       } 

       [streamIncomingData appendBytes:buffer length:len]; 

       int processedBytes = 0; 
       while (true) 
       { 
        if ([streamIncomingData length] >= processedBytes + sizeof(uint32_t)) 
        { 
         const char* bufferstart = ((const char*)[streamIncomingData mutableBytes]) + processedBytes; 
         uint32_t sz_n; 
         memcpy(&sz_n, bufferstart, sizeof(sz_n)); 
         uint32_t sz_h = htonl(sz_n); 

         if ([streamIncomingData length] >= processedBytes + sz_h + sizeof(uint32_t)) 
         { 
          [self processMessage:bufstart + sizeof(uint32_t) len:sz_h]; 
          processedBytes += sz_h + sizeof(uint32_t); 
         } 
         else 
         { 
          break; 
         } 
        } 
        else 
        { 
         break; 
        } 
       } 
       if (processedBytes) 
       { 
        if (processedBytes < [streamIncomingData length]) 
        { 
         NSMutableData *newdata = [NSMutableData dataWithBytes:[streamIncomingData bytes] + processedBytes length:[streamIncomingData length] - processedBytes]; 
         [streamIncomingData setData:newdata]; 
        } 
        else 
        { 
         [streamIncomingData setLength:0]; 
        } 
       } 
      } 

      break; 
     } 

processMessage方法:

- (void)processMessage:(const char*)msg len:(int)len 
{ 
    NSLog(@"processMessage start (%d)", len); 
    { 
     char buffer[len + 1]; 
     memcpy(buffer, msg, len); 
     buffer[len + 1] = '\0'; 
     NSLog(@"%s", buffer); 
    } 

    NSLog(@"processMessage end"); 
} 

何かアドバイス私はクラッシュのスタックトレースを添付しました下に大変感謝しています。

+0

何とか 'MainViewController'の' stream:handleEvent: 'と' processMessage:len: 'の最小限のコードがスタックに壊れていたり、オーバーフローしたりしています。 – Joe

+0

クラッシュが発生する場所のサンプルコードを含めるように質問を更新しました – Seb

答えて

3

の外にヌルターミネータを割り当てようとすると、bufferがオーバーフローしてスタックが破損しています。正しいコードは次のようになります。

char buffer[len + 1]; 
    memcpy(buffer, msg, len); 
    buffer[len] = '\0'; 
    NSLog(@"%s", buffer); 

あなたは何をしていた未定義の動作だったとリリースモードのために行われた最適化で未定義の動作を組み合わせることにより、あなたが唯一のリリースモードでこの問題を見て、最も可能性の高い理由です。

+0

愚かです。あなたは彼らの言うことを知っています、愚かな論理ミスを指摘するために目の第二のペアを持つことは常に良いです。どうもありがとうございました – Seb

関連する問題