아이폰/아이팟 터치 애플리케이션 개발 중 버그를 쉽게 잡는 두 가지 방법 그리고 tv팟 앱 업그래이드에 관하여




제 포스팅 중 가장 긴 제목을 가진 포스팅입니다. :) 얼마전 tv팟 애플리케이션 업그래이드 버젼을 배포했었습니다. 버젼이 1.2였고 새로운 UI를 추가하여 너무너무 즐거운 마음에 배포를 했었습니다. 새로 선보인 가로방향 모드에서의 film view는 이쁘긴 하죠? 사용하기도 편해서 좋습니다만.... 배포후 드디어 폭탄이 하나 터졌습니다. 예.... 이전 보다 훨씬 잦은 crash입니다. 이유가 머였을가요?







일단 첫번째 이유는 다들 생각하시는 메모리 관련이 맞습니다. 그렇지만 leak은 아닙니다.  바로 너무 많은 메모리를 사용하는 것입니다. film view에서 많은 이미지를 긁어오기 때문에 메모리 사용량이 급격하게 증가한 것이죠. 그렇지만 아이폰/아이팟 터치의 테이블은 이미 메모리관리가 되고 있습니다. 뷰도 그러하고 말입니다. 흐음...머가 문제였을까요? 바로 메모리를 많이 잡아먹고 있으니 보이는 뷰말고는 다 메모리에서 지워버린 것입니다. 음... 그럼 자동으로 생성해준다고 하지 않았나요? 맞습니다. 그런데... 거기서 생성이 잘 처리가 안된 것이죠. 뷰가 그렇게 생겨먹었는데 그 이유를 길게 적기는 뭐합니다. 일단 그건 그렇다치고 그럼 해법은? 뷰를 다 뜯어고치는 것! 자동으로 잘 생성되게... 이건 일이 많습니다. 그리고 변명의 여지도 있는 것이 interface builder를 사용하면 그렇게 코딩하게 되어 있었다는 것이죠. 끙...

그래서 해법은 아에 테이블의 셀을 재사용하는 pool을 따로 만들었습니다. 기본적으로 제공하는 방법을 다 걷어 냈습니다. 

결과는?
곧 받을 1.2.1버젼은 아마 대부분의 경우 죽지 않을 것입니다. :) 엄청나게 튼튼하고 안정적인 애플리케이션이 되었답니다. (짜자잔~ 아 기쁘다.) 그럼 얻은 경험은?

  • 인터페이스빌더는 곤란하다.- 편하지만 뚝딱만드는 간단한 것이 아니면 안쓰는 것이 좋다. 퍼포먼스도 문제가 생길 수 있다.
  • 애플이 제공하는 것을 맹신은 곤란하다. - 특별히 관리하고 싶을 것 같은 것들은 그냥 만들어 쓰는 것이 속편하다.

이렇게 낑낑거려서 겨우 만족할 만한 해답을 얻은 후 어제 제출을 했습니다. 음 생각보다 해결은 빨리 된 것이죠. 흐흐흐흐 애플리케이션이 갑자기 죽는 경우는 거의 다 메모리 문제입니다. 너무 많은 메모리를 사용해서 스프링보드가 강제로 죽이는 경우거나 또는 너무 많은 메모리를 사용해서 아이폰/아이팟 터치가 강제로 뷰를 메모리에서 내린 후 다시 생성을 못했거나... 아 하나 더 있군요. 메모리 관리 자체를 잘 못해서 해제한 메모리를 다시 해제하려고 했거나...

요즘처럼 스크립트 언어가 잘 되어있는 상황에서 메모리관리라는 것은 아무래도 피곤한 일입니다. 거기다가 Objective-C는 스크립트 언어같이 유연한데 메모리관리는 빡빡하니 좀 짜증이 나기도 하고 말이니다. 그래서 "예제로 시작하는 아이폰 개발"에서는 간단한 부록도 적긴 했는데 말입니다. :) 그런데 어제 배포전 쉽게 한번 더 확인할 수 있는 간단한 2가지 방법을 찾았습니다.






우선 첫번째 

C와 Objective-C의 버그를 찾아주는 툴입니다. 현재 커멘트라인 툴로 개발되어 있습니다. 아직 초기단계이고 모든 버그를 다 잡아주지는 않지만 그래도 훌륭합니다. 그냥 개발하는 프로젝트가 있는 곳에서 실행하게 되면 잘못한 코드를 집어주는 html 리포트까지 생성합니다. "여기서 너가 alloc하고 retain했는데 그냥 반환했어. 그럼 메모리에 남겠지?" 코드에 말풍선으로 아주 꼼꼼히 집어줍니다. (저도 배포전 돌려보고 3개 잡았습니다. 해해) 다 잡아주진 않지만 그래도 잡아주는게 어딘가요. 

홈페이지에 들어가시면 Mac OS X용은 미리 빌드가 되어 있습니다. 다운받고 적당한 곳에 두신 다음 path만 걸어주시면 준비는 오케이. 그리고 작업중인 프로젝트에 가셔서

$scan-build -k -V xcodebuild

간단하죠! 그러면 에러를 잡았을 경우 safari를 띄워 리포트까지 보여줍니다. 그 다음은 수정이죠. 아 안에 있는 다른 파일들은 그냥 scan-build가 사용하는 것입니다. 자세한 옵션들은 홈페이지를 참고하셔요. 아 그리고 꼭 debug상태로 project를 설정하고 돌리셔야 합니다. 

두번째 
빌드 환경설정입니다.

가장 하기 쉬운 실수 중에 하나인 release된 객체에 다시 release를 시도하는 또는 autorelease된 객체에 다시 release를 시도하는 경우입니다. 이걸 조금 더 잘잡아 주는 설정이 있습니다. Xcode에 Project메뉴 그 아래 Edit Active Executable을 선택합니다. 거기 Arguments 탭을 선택하신 다음 환경변수란에 아래 3가지를 등록하시고 YES로 설정합니다.




NSAutoreleaseFreedObjectCheckEnabled
NSZombieEnabled
NSDebugEnabled

YES로 설정한 경우는 release나 autorelease시 추가 확인을 수행하고 문제가 생겼을 경우 스택 트레이스를 제공합니다. 아 그리고 디버그시에는 Run메뉴의 Enable Guard Malloc 설정을 켜두는 것도 도움이 됩니다. 없는 것보다야 나은거죠. :)





앗 저기 이미지는 값을 설정하기 직전 창이군요. 이런~ 켑쳐를 하다보니... 값 YES로 설정하셔요. :) 하여간 작은 팁이지만 튼튼한 애플리케이션을 만드시는데 도움이 되었으면 좋겠습니다. 그럼 또!


ps1) 오늘 3월 4일! 드디어 "예제로 시작하는 아이폰 개발"이 yes24의 주간베스트 컴퓨터 부분 1위를 달성했습니다. 이런! 대박이! (참고로 전 잘 팔린다고 돈을 더 버는게 아닙니다. 절래절래~) 판매수량도 좋지만 정말 번역이 매끄럽더군요. 또는 정말 오류가 없더군요. 라는 후기를 보고 싶은데 아직 다들 공부 중이신지 서평이 없어요. 계속 불안해하고 있습니다. 흙 그렇지만 일단 기뻐해야죠? 




ps2) 코어 애니메이션 번역에 곧 들어갑니다. 좀 쉬어야죠 저도... 그런데 모바일 에디터라는 직함을 가지고 있어 이것 저것 에이콘에 말씀을 드렸더니... 덜컥 다음 번역책도 결정되었답니다. 아마 나오면 제 모바일 시리즈중 가장 많이 팔릴 책이 말입니다. 흐흐흐 기대해주셔요. 먼지는 말 못하죠! 해해해






Tag : , , , , ,
Track this back : http://i-dreaming.com/trackback/2511640 관련글 쓰기
Tracked from 에이콘 출판사 블로그 acornLoft 2009/03/05 14:34 x
제목 : [예·시 아이폰 개발] 인터넷 서점 YES24 컴·인 부문 1위!
30대 직장인 만든 게임 앱스토어서 대박 "청년 재벌 탄생" 30대가 쓴 게임 성공 신화토종게임 '헤비 매크' 세계 평정앱스토어에서 대박난 개발자들 5위라는 성적도 놀랍지만 평점이 별4개반이나 되네요. 축하합니다!아이폰/아이팟터치 애플리케이션 개발의 진두에 나선 드림위즈 이찬진 사장님의 블로그 글을 필두로 어제 오늘 청년개발자의 성공기를 전하는 보도기사들로 IT관련 뉴스계가 후끈 달아올랐습니다.이처럼 "Heavy Mach"를 만든 변해준님의 성공......more
Tracked from 하늘을 나는 타조알 2009/03/06 19:23 x
제목 : 아이폰이 엑셀을 이기다.
얼마전에 번역해 출간한 "예제로 시작하는 아이폰 개발" 책이 YES 24 컴퓨터와 인터넷 주간 베스트에 올랐습니다. 확인은 덜URL.me 에서 http://durl.me/bsp 출간하고 순위권에 진입한 것도 너무 기뻐서 혼자 좋아 했는데, 몇일 후 2위가 되었습니다. 1위는 막강한 "엑셀 & 파워 포인트 2007 무작정 따라하기" 그것을 보시고 그 때 주변에도, 저도 말하길.. 설마 엑셀&파워 포인트 책을 이기겠어, 프로그램 개발서에다, 수업시간에.....more
그 사이 이런 많은 일들을! 님좀짱이세요. ^^;

저도 서평이 기다려지는데 말이죠. 요새 아이폰 관련 좋은 소식이 많이 들려서 참 기분 좋네요. 독자들이 책에 이렇듯 뜨거운 반응 보여주시면 아이폰도 빨리 출시되지 않을까요. (궤변같지만 진짜로..ㅋㅋ)

그나저나 저도 줄 선 책들 빨리 오픈하고 싶어요. 번역 잘 부탁드리구요. 훌륭한 "시리즈 에디팅" 감사합니다.

다음 주 월요일 저녁 즐거운 출간기념파티 기대하세요~!! ^^*
BlogIcon bliss at 2009/03/04 16:44  r x
Replied by BlogIcon dreaming at 2009/03/05 01:42 x
열심히 하겠습니다. ㅎㅎㅎ
오오.. 책이 잘 팔린다니 축하드립니다..^^
저도 구입을 해야 할텐데요..
이런 저런 사정으로 좀 늦어지고 있네요..^^

좋은 팁까지 이렇게 알려주시니 더 좋군요..^^
BlogIcon drzekil at 2009/03/04 17:02  r x
Replied by BlogIcon dreaming at 2009/03/05 01:42 x
감사합니다. :) 열공!
내일 서점에 들려야 겠습니다.
한줄 at 2009/03/04 22:31  r x
Replied by BlogIcon dreaming at 2009/03/05 01:42 x
:)
베스트가 될 줄 알았다고 하면 어찌 생각하실지 모르겠지만...우리 나라에 제대로 된 플랫폼만 제공되면 의외로 자기 멋대로 뭔가 하고싶어 근질거리는 사람...하지만 영어는 좀 힘들어 하는 프로그래머는 굉장히 많다고 봅니다. 호기심에서라도 한 권 사 볼만 하죠. 저도 서점 들르면 살 생각이니;;

그리고 드디어 환률이 최고조에 올랐을 때 하두 답답해서 OS버전으로 올리고 티비팟과 다음맵을 깔아봤습니다. 이야~ 좋아요~ 검색도 만족스럽고~
BlogIcon JNine at 2009/03/05 00:19  r x
Replied by BlogIcon dreaming at 2009/03/05 01:43 x
더 열심히 하겠습니다. :) 얼릉 업뎃이 되야할텐데 말입니당.
안녕하세요? 아이폰 개발을 들여다보고 있는 나불이라고 합니다.
scan-build 사용을 위해 다운로드 받고, 터미널에서 path 위치 찾아서 scan-build폴더를 path에 추가하는 것까지는 성공했습니다.(재부팅필요하더군요~)
헌데 위에 적어주신대로 하니까 gcc관련 오류가 나더군요.
작업중인 프로젝트에 가서 $scan-build -k -V xcodebuild 이 명령어를 터미널로 들어가서 작업중인 프로젝트에서 입력하는 것 맞나요? xcode ide안에 커맨드 라인은 안보여서요^^;;
혹시 실행하게 되면, scan-build가 켜진 상태에서 xcode ide상에서 디버깅으로 프로젝트를 run하면 되는건지..
c개발을 처음해보는 거라서 메모리 관련 문제가 엄청 많네요 ㅜㅜ;
(그냥 run을 하면 멀쩡히 돌아가지만 경고메시지도 보이고 디버깅이나 알려주신 옵션을 키면 아예 동작을 안하고 뻣어버리네요^^)
아무쪼록 좋은 하루 되세요~!
BlogIcon 나불 at 2009/04/09 17:00  r x
Replied by BlogIcon dreaming at 2009/04/09 17:16 x
옙? 재부팅 필요없는데... @_@ 이상하네요. 일단 터미널로 작업하는게 맞습니다. 결과가 따로 나오구요. xcode랑은 상관없이 돕니다. 알아서 분석해서 답을 주는거죠. 조금 더 자세하게 step by step으로 한번 포스팅하겠습니다. :) 파이팅!
친절함 감사합니다^^
따로 댓글 달 기회가 없었는데 번역하신 책도 구입해서 잘 보고 있습니다^-^ 감사해요~!
BlogIcon 나불 at 2009/04/09 19:10  r x
LLVM/Clang Static Analyzer 에 대해 문의 드립니다.

설명해 주신대고 실행을 했는데, 터미널에서 몇 페이지의 분량의 텍스트가 쭉 지나가더니 마지막 페이지에 다음과 같은 에러가 납니다.

The following build commands failed:
project_name:
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/main.o /Users/Honeboy/Documents/iPhone/project_name/main.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/BaseViewController.o /Users/Honeboy/Documents/iPhone/project_name/Classes/BaseViewController.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/LogoView.o /Users/Honeboy/Documents/iPhone/project_name/Classes/LogoView.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/LogoController.o /Users/Honeboy/Documents/iPhone/project_nameClasses/LogoController.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/MealsController.o /Users/Honeboy/Documents/iPhone/project_name/Classes/MealsController.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/MealsView.o /Users/Honeboy/Documents/iPhone/project_name/Classes/MealsView.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/MealsTable.o /Users/Honeboy/Documents/iPhone/project_name/Classes/MealsTable.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/RecipeView.o /Users/Honeboy/Documents/iPhone/project_name/Classes/RecipeView.m normal armv6 objective-c com.apple.compilers.gcc.4_0
CompileC build/project_name.build/Release-iphoneos/project_name.build/Objects-normal/armv6/RecipeViewPage.o /Users/Honeboy/Documents/iPhone/project_name/Classes/RecipeViewPage.m normal armv6 objective-c com.apple.compilers.gcc.4_0
(9 failures)
(프로젝트 이름은 project_name로 변경했습니다. ^^;)

이렇게 나오고 맨 마지막에
scan-build: Removing directory '/var/folders/n8/n8DmBq1CFBSDHBiA22Df-U+++TI/-Tmp-/scan-build-2009-04-20-1' because it contains no reports.

이렇게 나오는데... 제 프로젝트에 버그가 없다는 걸까요? 아니면 빌드(?)를 하면서 에러가 나서 제대로 안되는 걸까요?
김제선 at 2009/04/20 11:45  r x
name    password   
homepage
 hidden






Am I dreaming? Yes, I am dreaming. and I am dreaming now.
 SEARCH
 Category
분류 전체보기 (511)
Life (71)
Interest (212)
Learning (89)
Work (139)
 Calendar
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
 Recent Entries
다음 소셜게임플랫폼 "요즘"을.. (17)
징가 팜빌에서 본 소셜게임 성.. (6)
여러분들 아니 그들은 왜 팜빌.. (18)
월드컵을 즐기는 새로운 방식.. (6)
아이폰으로 기록한 동경 (12)
아이폰으로 기록한 공항과 비.. (10)
와이어드 아이패드 애플리케이.. (24)
아이폰으로 기록한 베이징의.. (10)
아이폰으로 기록한 13년만에.. (68)
아이폰으로 기록한 드리밍의.. (18)
 Recent Comments
[비밀댓글]
- 07/28
좋은 글 잘봤습니다. ^^ 한동..
Sunny - 07/28
ROI를 따지게 될테니... 넘 힘..
dreaming - 07/26
벌써 삼성 갤럭시S에서 돌아가..
dy - 07/26
드리밍입니다. 제가 중국에서..
dreaming - 07/23
 Recent Trackbacks
헤즈론의 생각
hezron's me2DAY
퓨처워커의 생각
futurewalker's m..
어도비의 애플에..
숲속얘기의 조용..
Camera+, The Ult..
전사적자원관리
WWDC 2010 - keyn..
플레시 & 모바일..
 USERBARS
 Archive
2010/07
2010/06
2010/05
2010/04
2010/03
2010/02
 TAGS
tokyo Adobe Platform yozm Mobile Daum Live iPhoneography GiFT Digital Publishing Platform live streaming 소셜게임 airport worldcup ipad Social Network Game SKY Apple FarmVille iPhone zynga wwdc iPhoneograhpy Flash Platform game Digital Viewer Technology for Magazine China SNG Social Game plane
 Notice
한주 자리를 비웠었습니다.
한메일 express 초대권을 드립..
티스토리 이사 완료
티스토리로 이사중입니다.
Domain회복!
 Link Site
Huck의 Develop life
Lost Cause vs. Basket Case
Mindstor.net
MTGEAR
NmindPlus
watercolor: photocolor
날수있을까?타조알
다음 동영상 개발팀 Offici..
이런 저런 이야기
 Visitor Statistics
Total : 1,352,984
Today : 655
Yesterday : 393
Statistics Graph
rss