이것도 경험이 없으면 꽤나 찾기 어려운 것중 하나.

다음과 같이 프로젝트를 만들었다고 하죠. 프로젝트에 두 개의 사용자 컨트롤이 있고 하나의 IValueConverter가 있어요. 그리고 테스트를 충분히 해서 Release 모드로 빌드를 했다고 합시다.

그런데 디자인을 익스프레션 블렌드에서 보고 싶어졌어요. 이 프로젝트를 블렌드에서 띄우면?

이와 같이 자기 자신의 네임스페이스도 못 찾게 되죠. 이상한 점은 <UserControl.Resources> 안에 선언된 것만 못찾는다는 점이에요. 위의 코드에서 <UserControl.Resources>블럭을 삭제하면 정상적으로 뜨는 것을 확인할 수 있거든요.

문제를 해결하려면, 비주얼 스튜디오에서 빌드 모드를 Debug로 설정하고 다시 빌드한 후 블렌드에서 열면 돼요.

문제의 원인은 바로 블렌드는 항상 Debug모드로 간주되는데 비주얼 스튜디오에서 빌드할 때 Release 모드로 빌드를 했기 때문이에요.
뭔가 우습지만 막상 닥쳤을 때 찾기 어려운 문제라 기록해둡니다.

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo
오랫만에 찾아온 쫄지 마세요 씨~리즈
제목과는 다르게 사실 이 시리즈는 실전에서 어찌할 바를 모를 정도로 당황 할 만한 상황과 해결책에 대한 팁이죠. 그건 그렇고.

방금 잡은 따끈따끈한 버그 한마리.

실버라이트 2의 URI는 참조된 어셈블리의 리소스를 표현할 수 있죠. 그래서 다음과 같이 다른 어셈블리의 리소스로 들어 있는 이미지나 XML, XAML등을 가져올 수 있어요.
<Image Source="/SomeAssembly;component/Image/Foo.png" />
그런데 만약 굵게 표시한 SomeAssembly라는 어셈블리가 존재하지 않을 경우 실버라이트 2 애플리케이션은 일말의 경고도 없이 가차 없이 공포의 '화이트 스크린'을 뿌리며 죽어버리죠.

이게 위의 한줄만 보면 문제가 생기는게 너무나도 당연하지만 생각해보세요, XAML은 그야말로 엄청난 길이의 코드로 이루어지게 되는데 프로젝트 도중에 무심코 Copy&Paste 했다가 나~중에서야 동작 테스트에 들어갔다면? 네, 바로 패닉에 빠지게 되는거죠.

오늘의 디버깅 팁(by Boxmile the XAML Expert)
- 실버라이트 애플리케이션이 Exception 없이 죽을 때
- XAML 오류가 날 때
위의 증상이 일어나면...
의심되는 XAML을 전체 주석처리하고 테스트, 다음으로 한줄 한줄씩 주석을 해제 하면서 문제의 원인이 되는 XAML을 찾아보세요.

오늘의 한 마디(by Gilbert)
개발자 망신은 Copy&Paste가 다 시킨다.
신고
Posted by gongdo
실버라이트를 하다보면 어떤 XAML 파일에서 이런 에러를 많이 보게 될거에요.
Object reference not set to an instance of an object
코드에러 지점이 XAML의 첫번째 행으로 잡혀있고 어떠한 힌트도 주지 않죠.

정말이지 엄청나게 삽질을 하게 될 수도 있는 이 에러의 원인은 주로 단순한 오타에서 비롯되는 경우가 많아요.

바로 몇 분전에 길버트님이 겪었던 문제를 예로 들자면...
<Rectangle Width="30" Height="3 0" Fill="#FF000000" />
별 문제 없어보이죠? 눈썰미가 좋은 분은 금방 찾으셨겠지만 문제의 원인은 Height="3 0"에서 중간에 공백이 들어갔고 XML 파싱에 실패한 것이죠.

특히 편집기를 여기저기 왔다갔다 하면서 하다보면 가끔 원치 않는 키스트로크가 들어갈 때도 있잖아요? 저는 z를 실수로 많이 찍는 편이에요.

앞으로 저 에러를 만나면 쫄지 말고 침착하게 XAML의 오타를 찾아보세요.
신고
Posted by gongdo
오류 리포팅
에러 종류 : System.ArgumentException
예외 메시지 : Value does not fall within the expected range.
스택 덤프(예제) :
at MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData)
at System.Windows.DependencyObject.MethodPack(IntPtr objectPtr, String methodName, Object[] rawData)
at System.Windows.DependencyObject.MethodPack(String methodName, Object[] rawData)
at MS.Internal.Collection`1.Add(T value)
at [Namespace].Page.[Method]()

원인
1. 로드한 XAML의 x:Name가 중첩된 경우, 특히 embedded resource로 등록한 XAML을 여러개 로드하여 Canavas에 추가할 때 발생.

샘플 코드
// 동적으로 추가할 xaml 코드 정의
// x:Name이 설정되어 있음에 유의

string xaml = "<Canvas xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' x:Name='testCanvas' />";

// 동적으로 xaml 문자열로부터 엘리먼트를 생성
Canvas cv = XamlReader.Load(xaml) as Canvas;
cv.Width = 50;
cv.Height = 50;
cv.Background = new SolidColorBrush(Color.FromRgb(0xFF, 0x00, 0x00));

// 동적으로 루트 캔버스에 추가
this.Children.Add(cv);

// 똑같은 xaml 문자열로부터 엘리먼트를 생성, 여기까지는 문제 없음
Canvas cv2 = XamlReader.Load(xaml) as Canvas;
cv2.Width = 50;
cv2.Height = 50;
cv2.SetValue<double>(Canvas.LeftProperty, 100);
cv2.Background = new SolidColorBrush(Color.FromRgb(0x00, 0xFF, 0x00));

// 두번째로 생성된 엘리먼트를 추가할 때 x:Name의 중복으로 인한 런타임 예외 발생
this.Children.Add(cv2);

샘플 코드 다운로드 : http://gongdo.tistory.com/attachment/cfile3.uf@211B4A365878F5AD083A41.zip


모든 문제가 대부분 그렇지만, 원인을 찬찬히 생각해보면 당연할거에요. 하지만 이 문제를 처음 접하면 도대체 어디서 잘못해서 이런 예외가 발생했는지 도무지 알 수가 없거든요. 왜냐면 예외에 대한 메시지가 너무 뜬금없어요. '값이 올바른 범위 내에 있지 않습니다.' 이런 메시지만 가지고 x:Name이 중복되었을 거라고 상상할 수 있겠어요? 저도 처음에 이 예외를 만났을 때 정말 오랜 시간 동안 빙빙 돌았던 것 같아요.

샘플 코드를 리뷰하자면, string xaml은 편의상 코드로 바로 적어 넣었지만 아마 외부에 있는 XAML 리소스를 런타임에 읽어온다거나 혹은 DB에 저장되어 있는 XAML 문자열을 읽어 왔다거나 하는 상황일거에요.

여기에서 XamlReader.Load 메서드를 통해 엘리먼트를 생성한 시점에서는 XAML에 문법적인 문제가 없는 한 아무런 예외 없이 잘 만들어 질 거에요. 그런데 이렇게 생성한 엘리먼트를 루트 캔버스에 추가하면 첫 번째는 잘 되다가 두 번째부터 갑자기 안되는 현상으로 나타나겠죠. 이때 착각하기 쉬운게 두 번째 생성도 문제없이 넘어갔기 때문에 XAML 문자열에는 아무런 문제가 없다고 믿어버리게 되는 거에요. 그래서 코드만 죽어라고 뜯어보고 이렇게도 해보고 저렇게도 해보고 삽질을 시작하는 거죠.

즉 디버깅하기 가장 어려운 케이스인 문제의 원인과 에러가 발생하는 위치가 동떨어져 있는데다가 에러 메시지 조차 도무지 무슨 소린지 알 수 없는 경우가 된 거에요.

아직은 이런 케이스를 만나기가 쉽지 않겠지만, 점차 동적으로 XAML을 로드 한다거나 사용자 정의 컨트롤을 작성한다거나 하면서 분명히 이런 문제에 부딪칠 수 있을 거에요.

그럴 때에도 이제는,

DON'T PANIC!

신고
Posted by gongdo
사용자 삽입 이미지

한창 할 것도 많은데 난데없는 시리즈 예고,
DON'T PANIC!
쫄지 마세요!

뭐든 프로그래밍하다보면 하란대로 했는데, 어제만 해도 잘 돌았는데, 붙여넣었을 뿐인데도 런타임 오류며, 예외며 오동작이며 가지 각색의 버그를 만나잖아요?

이 시리즈는 실버라잇을 하면서 접할 수 있는 다양한 문제점들에 대한 원인과 해결책에 대해서 다룰 예정이에요.

지금은 한 서너개 정도 케이스가 있는데 오늘은 졸려서 시리즈 예고만. : )
신고
Posted by gongdo


티스토리 툴바