2012-03-06 4 views
0

원시 IP 데이터를 처리하여 비디오 신호 (ATSC-MH)를 처리하고 있습니다. 그러나, 나는 약간의 기본적인 문제에 문제가 있고 나는 분명히 순간에 튀겨졌고 또 다른 눈을 필요로한다.크래시 형식의 문자열에 대한 EXC_BAD_ACCESS

이것은 넘기는 ​​기능입니다. 재미 있은 부분은 그것이 잠시 동안 일하고 나가 변화하는 것을 생각 나게 할 수 없다이다. ** d 라인은 오류 로그에서 참조되는 라인입니다. 스트림 액세서리 (그래서 아무 직접 디버깅 파이프 :()에서 유래 때문에 많은 NSLog 디버깅 할 수 없습니다.

다음
-(NSString*)reportSMT{ 
//NSString* ret = @"Not implemented yet"; 
__autoreleasing NSMutableString* ret = [[NSMutableString alloc] initWithFormat:@"\nSMT:\n SecSynInd:%@ PriInd:%@\n SecLen:%d SMTMHProVer:%d\n EnID:%d VerNum:%d\n CurNxtInd:%@ SecNum:%d\n lastSec#:%d #Servs:%d\n\n",([email protected]"YES":@"NO"),([email protected]"YES":@"NO"),Header.section_length,Header.SMT_MH_protocol_version,Header.ensemble_id,Header.version_number,([email protected]"YES":@"NO"), Header.section_number,Header.last_section_number,Header.num_MH_services]; 
[ret appendString:[NSString stringWithFormat:@"SMT Table:\n"]]; 
for (int i = 0; i<Header.num_MH_services; i++) { 
    **[ret appendString:[NSString stringWithFormat:@"Serv(%d):\n ServID:%d MultiEnServ:%d\n ServStat:%d ServSPInd:%@\n ServShotName:%@\n ServCat:%d\n source:%@ dest:%@\n #MHServComps:%d\n",i,Services[i].MH_service_id,Services[i].multi_ensemble_service,Services[i].MH_service_status,(Services[i][email protected]"YES":@"NO"),[NSString stringWithUTF8String:(char*)Services[i].short_MH_service_name],(Services[i].service_source_IP_address_flag?[Utility ParseIP:Services[i].service_source_IP_address]:@"N/A"),(Services[i].service_destination_IP_address_flag?[Utility ParseIP:Services[i].service_destination_IP_address]:@"N/A"),Services[i].num_components]];** 
    for (int m=0; m<Services[i].num_components; m++) { 
     [ret appendString:[NSString stringWithFormat:@" Comp(%d)(essential:%@):\n port#count:%d compSource:%@\n compDest:%@ destPort:%d\n",m,(Services[i].components[m][email protected]"YES":@"NO") ,Services[i].components[m].port_num_count,(Services[i].components[m].component_source_IP_address_flag?[Utility ParseIP:Services[i].components[m].component_source_IP_address]:@"N/A"),(Services[i].components[m].component_destination_IP_address_flag?[Utility ParseIP:Services[i].components[m].component_destination_IP_address]:@"N/A"),Services[i].components[m].component_destination_UDP_port_num]]; 
    } 
} 

return [ret copy]; 
} 

유틸리티 parseIP 기능.이 전화를 언급 아무것도 변경하지 않았지만 것입니다 그것은에 거기에 값을 하드 코딩 : 여기

+(NSString*)ParseIP:(long)ip{ 
__autoreleasing NSString* ret = nil; 

if (ip) { 
    unsigned char* ipPtr = (unsigned char*)&ip; 
    unsigned char ipc[4]; 
    for (int i=0; i<4; i++) { 
     ipc[i] = *(ipPtr+i); 
    } 
    ret = [NSString stringWithFormat:@"(%d.%d.%d.%d)",ipc[3],ipc[2],ipc[1],ipc[0]]; 
} 

return ret; 
} 

은 SMT의 부분에 대한 구조 :

struct SMTChunk{ 
unsigned int MH_service_id;//16 
unsigned char multi_ensemble_service;//2 
unsigned char MH_service_status;//2 
bool SP_indicator;//1 
unsigned char short_MH_service_name_length;//3 /* m */ 
unsigned char* short_MH_service_name;//16*m 
unsigned char reserved2;//2 should be 11 
unsigned char MH_service_category;//6 
unsigned char num_components;//5 
bool IP_version_flag;//1 
bool service_source_IP_address_flag;//1 
bool service_destination_IP_address_flag;//1 
unsigned long service_source_IP_address;//32 if (service_source_IP_address_flag) 
unsigned long service_destination_IP_address;//32 if (service_destination _IP_address_flag) 
struct SMTComponent* components; 
unsigned char reserved4;//4 1111(f) 
unsigned char num_MH_service_level_descriptors;//4 
struct SMTServiceDescriptor* descriptors; 
}; 

나는이 전에 일하고 있었다, 그래서 나는 파서 확신 말했듯이 채우다 데이터 구조는 괜찮습니다.

장치 로그 (중요한 부분) : 나는 영원히이 응용 프로그램 작업을 했어요 그래서 당신이 줄 수있는 어떤 도움이나 포인터가 환영처럼

Date/Time:  2012-03-06 00:56:40.480 -0600 
OS Version:  iPhone OS 5.0.1 (9A405) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000a 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x300e4fb6 objc_msgSend + 10 
1 Foundation      0x30dd9d14 _NSDescriptionWithLocaleFunc + 44 
2 CoreFoundation     0x335d699e __CFStringAppendFormatCore + 7998 
3 CoreFoundation     0x33551210 _CFStringCreateWithFormatAndArgumentsAux + 68 
4 Foundation      0x30dd9c3e +[NSString stringWithFormat:] + 54 
5 APT-test      0x000c9630 -[SMT reportSMT] (SMT.m:178) 
6 APT-test      0x000c54bc -[VideoViewController saveTimerFun:] (VideoViewController.mm:940) 
7 Foundation      0x30e79616 __NSFireTimer + 138 

느낀다.

미리 감사드립니다.

+0

하나의 문제 코드 행에는 8 가지 대체 코드가 있습니다. 적어도 3 가지 코드는 일부 개체에 설명을 호출 할 수 있습니다. 이것을 훨씬 더 좁힐 수 있습니다. –

+1

"재밌는 부분은 그것이 잠시 동안 일하고 있다는 것과 내가 바꾼 것을 기억할 수 없다는 것입니다." - 소스 컨트롤을 사용하여 시작하는 시간입니다 (예 : 망할 길이다. –

+0

나는 git를 사용한다 ... 나는 단지 적어도 모든 빌드에서 커밋해야한다고 생각하지는 않는다. 오 잘. 어떤 사람들은 밤에 일하기에 가치있는 일을 해내 야합니다. –

답변

2

printf 와일드 카드 및 인수가 제대로 균형을 표시하지 않습니다 당신이 EXC_BAD_ACCESS 발생하는 것은 매우 가능성이있는 Services[i].num_components에 위치 (9)에서 %@ 지정과 일치하려는처럼

[NSString stringWithFormat:@"1%d 2%d 3%d 4%d 5%@ 6%@ 7%d 8%@ 9%@ A%d", 
    /* 1 */i, 
    /* 2 */Services[i].MH_service_id, 
    /* 3 */Services[i].multi_ensemble_service, 
    /* 4 */Services[i].MH_service_status, 
    /* 5 */(Services[i][email protected]"YES":@"NO"), 
    /* 6 */[NSString stringWithUTF8String:(char*)Services[i].short_MH_service_name], 
    /* 7 */(Services[i].service_source_IP_address_flag?[Utility ParseIP:Services[i].service_source_IP_address]:@"N/A"), 
    /* 8 */(Services[i].service_destination_IP_address_flag?[Utility ParseIP:Services[i].service_destination_IP_address]:@"N/A"), 
    /* 9 */Services[i].num_components]]; 

것 같습니다 . 더 읽기 쉽도록 코드를 다시 작성하는 것이 가장 좋을 것입니다.이 혼란은 문제를 묻는 것입니다.

+0

다른 구성 요소를 제거한 것처럼 보입니다. 실수로 서비스 [i] .MH_service_category도 삭제했습니다. # 7을 사용 해 주셔서 감사합니다. 내가 말했듯이, 그것은 어리석은 일이 단지 그것을 보았을 때 눈을 가리고 있다는 것을 알았습니다. 감사! –