2012-08-02 3 views
1

내 애플리케이션에서 ARC로 변환 된 애플리케이션 인 메모리 누수가 발견되었습니다.libsystem_c.dylib의 메모리 누수

악기 제가 문제에 대해 검색하고 난

에 관련 게시물을 발견

..

내가 여기에 스크린 샷을 첨부하고 libsystem_c.dylib 누출 책임 라이브러리는 것을 보여준다 instruments-show-leak-in-main-m-xcode-4-3-1

obj-c-memory-leak-of-malloc-48-bytes-in-strdup-framework

iOS 5.1 프레임 워크의 버그입니까?

이 문제에 대한 도움을 주시면 감사하겠습니다.

enter image description here

enter image description here

+0

나는 이것을 'strdup' 함수에 의해 생성 된 문자열로 해석하지 않는다. 'strdup'를 사용하지 않으면 문제가 다른 곳에서 발생할 수 있습니다. 전화 추적을 게시 할 수 있습니까? – Krumelur

+0

예, 5.1 및 5.1.1의 알려진 버그입니다. 내가 올바르게 기억한다면 scrollviews와 관련있다. – danielbeard

답변

1

편집 :

실제로는 아이폰 OS SDK 5.1에서는 StrDup (또는 관련) 버그의 어떤 왕이 보인다. developers forum에서이 스레드를보십시오.

Elements 샘플 (이는 버그를 나타 내기 위해 말하는 것임)에 조금 들어가서 같은 종류의 기능을 사용하는지 확인하면 흥미로울 것입니다. 여기

누출의 순간에 스택 추적입니다 :

0 libsystem_c.dylib malloc 
1 libsystem_c.dylib strdup 
2 libnotify.dylib token_table_add 
3 libnotify.dylib notify_register_mach_port 
4 libnotify.dylib notify_register_dispatch 
5 CoreFoundation _CFXNotificationRegisterObserver 
6 CoreFoundation CFNotificationCenterAddObserver 
7 UIKit -[UIScrollView(Static) _startTimer:] 
8 UIKit -[UIScrollView _endPanWithEvent:] 
9 UIKit -[UIScrollView handlePan:] 
10 UIKit _UIGestureRecognizerSendActions 
11 UIKit -[UIGestureRecognizer _updateGestureWithEvent:] 
12 UIKit ___UIGestureRecognizerUpdate_block_invoke_0541 
13 UIKit _UIGestureRecognizerApplyBlocksToArray 
14 UIKit _UIGestureRecognizerUpdate 
15 UIKit _UIGestureRecognizerUpdateGesturesFromSendEvent 
16 UIKit -[UIWindow _sendGesturesForEvent:] 
17 UIKit -[UIWindow sendEvent:] 
18 UIKit -[UIApplication sendEvent:] 
19 UIKit _UIApplicationHandleEvent 
20 GraphicsServices PurpleEventCallback 
21 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 
22 CoreFoundation __CFRunLoopDoSources0 
23 CoreFoundation __CFRunLoopRun 
24 CoreFoundation CFRunLoopRunSpecific 
25 CoreFoundation CFRunLoopRunInMode 
26 GraphicsServices GSEventRunModal 
27 UIKit UIApplicationMain 
28 TheElements 0x300a 
29 TheElements 0x2fc3 

당신은 악기에 "쇼 확장 상세"(또는 비슷한)를 선택하여 누수의 순간에 당신의 스택 트레이스를 얻을 수 있습니다 보기 메뉴.

OLD 답변 :

나는 그렇지 않다고 생각합니다.

사실, "책임있는 라이브러리"로 표시된 것은 실제 malloc 호출이 효과적으로 실행 된 곳입니다.

계기판 출력을 살펴보면 범인은 strdup이며 strdup에는 누수가 없을 수 있습니다.

OS에 (직접 또는 간접적으로) 일부 문자열을 복제하도록 요청했지만 그 결과 문자열의 결과 복사본을 잘못 관리했을 가능성이 큽니다.

장비가 제공하는 확장 상세보기를 분석하면 malloc이 호출 된 순간의 호출 스택을 보여줍니다. 이 은 코드와 malloc 호출간에 직접적인 관계가있는 경우 도움이 될 수 있습니다. 그러나 세부적인 뷰가 그러한 관계를 나타내지 않더라도 코드에서 누수 원인을 찾아야합니다.

일반적으로 누수가 발견되면 앱의 어느 부분이 실행 중인지 이해하려고 시도합니다 (누수가 이산 시간에 분석된다는 사실을 고려하십시오.매 10 초마다 빨간색 막대가 나타나면 누출이 지난 10 초 동안 생성되었음을 의미합니다.) 그리고 관련 클래스에서 수행하는 모든 메모리 작업을 검토합니다.

내 경험에 따르면 Instruments는 누출에 대한 책임있는 "책임"으로 Instruments의 일부분을 보여 주지만 매우 정상적인 (경우의 100 %). 그러나 더 깊은 분석에서 잘못된 부분은 내 부분에 있습니다.