2013-05-19 1 views
0

iPhone 응용 프로그램에서 버그를 수정하고이 상황에서 스스로 찾으려고합니다. 인스턴스 변수 myView는 MYTextView 유형이며 MYTextView는 UITextView의 하위 클래스입니다. 디버거에서 디버거에서 결과 변경

내가 연속으로 몇 번을 입력 한 결과 위

(lldb) p myView.text 
(NSString *) $34 = 0x095da870 @"พี(the-date-in-Thai-Language) 
05" 
(lldb) p myView.text 
(NSString *) $35 = 0x0a2c5620 @"พี(the-date-in-Thai-Language) 
" 
(lldb) p myView.text 
(NSString *) $36 = 0x09515f60 @"พี(the-date-in-Thai-Language) 
щ" 
(lldb) p myView.text 
(NSString *) $37 = 0x09515f80 @"พี(the-date-in-Thai-Language) 
㏀ड़ख़筀ज़툠ज़梐 
⨈Ⴊ" 
(lldb) p myView.text 
(NSString *) $38 = 0x0a2c3800 @"พี(the-date-in-Thai-Language) 
妜샷फ़" 
(lldb) p myView.text 
(NSString *) $39 = 0x095e7010 @"พี(the-date-in-Thai-Language) 
" 

$ 35 : P는 myView.text 이상한 것은, 하나는 아래에서 볼 수 있듯이, 내가 다른 결과를 얻을 수 있다는 것입니다 $ 39는 내가 예상 한 것을 포함하고, 다른 줄들은 expect 문자열의 끝에 쓰레기를 포함하고있다.

디버거 내부에있을 때이 일시적인 쓰레기가 어떻게 될지 이해하지 못합니다. 또 하나의 문제는 태국어 언어와 관련된 문제 만 있습니다.

어떤 일이 벌어 질지 상상해보십시오.

답변

0

이것은 NSString 용 데이터 포맷터의 버그처럼 보입니다. Xcode 4.6을 사용하고 있습니까? 그렇다면 가능한 한 많은 문맥으로 Xcode에 대한 버그를 제기하면 나는 그것을 좋아할 것입니다. 내 생각 엔 제대로 관리되지 않는 버퍼가있는 것 같습니다.

0

p 명령을 사용할 때 lldb에서 수행 할 수있는 여러 가지 작업이 있습니다.

단순 콘크리트 유형 (int, int *)의 경우 변수 (10, 0xffffffff83021600)의 값만 인쇄 할 수 있습니다. 포맷터 환경 설정 세트가있을 수 있습니다 (예 : int을 16 진수로 표시). 더 정교한 파이썬 포매터 (메모리의 다른 부분을 읽고 당신에게 객체의 고수준 뷰를 제공 할 수 있음)가있을 수 있습니다. 마지막으로 실제로 프로그램에서 코드를 실행하여 해당 변수에 대한 상위 수준의 뷰를 만들 수 있습니다.

이 경우 Xcode 4.6에서는 간단한 NSString ivar처럼 보입니다. 따라서 lldb는 NSString 객체 용 내장 파이썬 포맷터를 사용할 수 있습니다. 이 내장형 포맷터는 객체 메모리를보고 프로그램에서 코드를 실행하지 않고 표시 할 실제 문자열을 재구성하는 방법을 알고 있습니다. 이 경우 문자열의 내용을 수정해서는 안됩니다.

이전 버전 (및 gdb)은 프로그램에서 문자열을 포맷하기 위해 코드를 실행할 수 있으며 프로그램이 프로세스에서 약간 변경 될 수 있습니다. 그런 일이 발생하지 않도록 많은 일이 이루어졌지만 가능성은 존재합니다.

엔리코는 NSString에 대한 내장 파이썬 포맷터 기능이 어떻게 든 프로그램에서 잘못 수행되어 포맷터를 다시 호출 할 때 변경되는 문자열 요약을 제공 할 수 있다고 생각합니다. 이 문제를 재현하는 방법에 대한 자세한 내용은 http://bugreport.apple.com/에 버그 리포트를 제출하십시오.

+0

이 경우 가장 좋은 것은 설명하기 쉽도록 작은 프로그램을 만드는 것입니다. 그리고 독서하는 사람들에게도 쉽습니다. – Michel

+0

위의 조언에 따라 샘플 프로젝트를 빌드하고 버그 보고서를 작성했습니다. – Michel

+0

위대한! 그게 고정되어 있는지 확인하는 가장 좋은 방법입니다 - 다른 사람이이 특별한 문제에 부딪혔다 고 생각하지 않습니다. –