Microsoft MVP성태의 닷넷 이야기
오류 유형: 59. WPF - XAML 로딩 시 Visual Studio 비정상 종료 [링크 복사], [링크+제목 복사],
조회: 30521
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

WPF - XAML 로딩 시 Visual Studio 비정상 종료


예전 Visual C++의 대화창 디자인 폼과 비교해 보면, 요즘의 WinForm/WPF 디자이너는 대단한 발전을 한 셈이죠. Visual C++이야 뭐, 리소스 파일에 있는 대화창 관련 텍스트 내용을 읽어서 화면에 표시하고 다시 그 정보를 리소스 파일에 텍스트로 써 넣는 역할만을 담당했었지만. WinForm/WPF는 "코드" 자체를 실행시켜서 디자인 화면에 뿌려주고 있기 때문에 실행 시와 유사한 디자인 화면을 제공해 주고 있습니다.

그런데.

꼭 이것이 좋은 것만은 아닙니다. "코드"를 실행한 결과를 디자이너에 반영하기 때문에 실제 런타임 시의 화면을 최대한 잘 반영할 수 있는 반면, 그 반대로 코드 내부에 "(논리) 버그"가 있는 경우, 원인 모를 현상에 시달릴 수도 있기 때문입니다.

최근 제가 경험했던 것을 예로 들면.

Visual Studio 2008에서, XAML 페이지를 로딩만 하면 그 즉시 VS 2008이 종료되어 버렸습니다. 흔하디 흔한 예외 상자도 뛰우지 않고, 단지 이벤트 로그에 아래와 같은 내용만을 뿌릴 뿐이었습니다.

.NET Runtime version 2.0.50727.3053 - Fatal Execution Engine Error (6AD90F92) (0)

Faulting application devenv.exe, version 9.0.30729.1, 
time stamp 0x488f2b50, faulting module kernel32.dll, version 6.0.6001.18000, 
time stamp 0x4791a76d, exception code 0xe053534f, 
fault offset 0x000442eb, process id 0xab4, application start time 0x01c92cce5378d099.

Watson 버킷 정보가 친절하게도 풀이되어서 나오고 있긴 한데. 그것뿐, 더 이상 추적할 만한 단서가 없었습니다. 예외 코드 "0xe053534f"의 오류 정보가 매우 애매합니다. 웹 검색을 해보면, "Software unknown exception"이라는 것이 전부이고, "SSCLI20"에 공개된 .NET Framework 소스 코드에 달랑 상수로 정의된 것이 전부입니다.

#define EXCEPTION_SOFTSO  0xe053534f    
    // 0xe0000000 | 'SSO'
    // We can not throw internal C++ exception through managed frame.
    // At boundary, we will raise an exception with this error code

도저히 모르겠습니다. ^^;

어쨌든, 범위를 좁힐 수 있는 것이라고는 디자이너가 "코드"를 사용한다는 것뿐이 없기 때문에 XAML 파일의 구조를 열심히 뜯어보기 시작했습니다.

과연, 심각한 문제가 있긴 했습니다.

xaml의 데이터 바인딩에 사용되는 StaticResource의 특정 이름을 풀이해 주기 위해서 집어 넣었던 것이 위의 예외를 발생시킨 원인이었습니다.

간단하게 코드를 보면,

===== 문제의 XAML 페이지에 대한 cs 코드 파일 ====
public  partial class UserControlBase : UserControl
{         
    public UserControlBase()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            this.Resources.Add("MyComboBox", new TestApp.MyComboBox());
        }
    }
}

===== TestApp.MyComboBox의 정의 ====
public MyComboBox : UserControlBase
{
    ... [생략]...
}

대강 아시겠죠? ^^

WPF 디자이너가 XAML 페이지를 로드하고 있는데, UserControlBase라는 생성자를 실행하면서 다시 MyComboBox를 생성하고 있습니다. 문제는 MyComboBox가 다시 UserControlBase를 상속 받고 있다는 것.

그로 인해 무한 객체 생성이 시작되어, 위의 XAML 페이지를 디자이너로 불러들이면 잠시 동안의 CPU 100% 현상을 거쳐서 Visual Studio가 비정상 종료해버리는 원인을 가져온 것입니다. 이것으로 문제 파악 끝!

끝으로 한마디!
만약, 여러분들의 WPF 디자이너가 어느 순간부터 비정상 종료를 시작했다면... 코드를 한번 살펴 보시기 바랍니다. ^^



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/10/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2008-10-18 10시10분
kevin25

... [76]  77  78  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
12096정성태12/30/201921661디버깅 기술: 149. C# - DbgEng.dll을 이용한 간단한 디버거 제작 [1]
12095정성태12/27/201924473VC++: 135. C++ - string_view의 동작 방식
12094정성태12/26/201922780.NET Framework: 873. C# - 코드를 통해 PDB 심벌 파일 다운로드 방법
12093정성태12/26/201921713.NET Framework: 872. C# - 로딩된 Native DLL의 export 함수 목록 출력파일 다운로드1
12092정성태12/25/201919579디버깅 기술: 148. cdb.exe를 이용해 (ntdll.dll 등에 정의된) 커널 구조체 출력하는 방법
12091정성태12/25/201923477디버깅 기술: 147. pdb 파일을 다운로드하기 위한 symchk.exe 실행에 필요한 최소 파일 [1]
12090정성태12/24/201923128.NET Framework: 871. .NET AnyCPU로 빌드된 PE 헤더의 로딩 전/후 차이점 [1]파일 다운로드1
12089정성태12/23/201920850디버깅 기술: 146. gflags와 _CrtIsMemoryBlock을 이용한 Heap 메모리 손상 여부 체크
12088정성태12/23/201920441Linux: 28. Linux - 윈도우의 "Run as different user" 기능을 shell에서 실행하는 방법
12087정성태12/21/201920647디버깅 기술: 145. windbg/sos - Dictionary의 entries 배열 내용을 모두 덤프하는 방법 (do_hashtable.py) [1]
12086정성태12/20/201924249디버깅 기술: 144. windbg - Marshal.FreeHGlobal에서 발생한 덤프 분석 사례
12085정성태12/20/201922434오류 유형: 586. iisreset - The data is invalid. (2147942413, 8007000d) 오류 발생 - 두 번째 이야기 [1]
12084정성태12/19/201922187디버깅 기술: 143. windbg/sos - Hashtable의 buckets 배열 내용을 모두 덤프하는 방법 (do_hashtable.py) [1]
12083정성태12/17/201924713Linux: 27. linux - lldb를 이용한 .NET Core 응용 프로그램의 메모리 덤프 분석 방법 [2]
12082정성태12/17/201923264오류 유형: 585. lsof: WARNING: can't stat() fuse.gvfsd-fuse file system
12081정성태12/16/201925808개발 환경 구성: 465. 로컬 PC에서 개발 중인 ASP.NET Core 웹 응용 프로그램을 다른 PC에서도 접근하는 방법 [5]
12080정성태12/16/201921885.NET Framework: 870. C# - 프로세스의 모든 핸들을 열람
12079정성태12/13/201924735오류 유형: 584. 원격 데스크톱(rdp) 환경에서 다중 또는 고용량 파일 복사 시 "Unspecified error" 오류 발생
12078정성태12/13/201924610Linux: 26. .NET Core 응용 프로그램을 위한 메모리 덤프 방법 [3]
12077정성태12/13/201922244Linux: 25. 자주 실행할 명령어 또는 초기 환경을 "~/.bashrc" 파일에 등록
12076정성태12/12/201922169디버깅 기술: 142. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅 - 배포 방법에 따른 차이
12075정성태12/11/201923052디버깅 기술: 141. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅
12074정성태12/10/201922406디버깅 기술: 140. windbg/Visual Studio - 값이 변경된 경우를 위한 정지점(BP) 설정(Data Breakpoint)
12073정성태12/10/201922733Linux: 24. Linux/C# - 실행 파일이 아닌 스크립트 형식의 명령어를 Process.Start로 실행하는 방법
12072정성태12/9/201919285오류 유형: 583. iisreset 수행 시 "No such interface supported" 오류
12071정성태12/9/201924015오류 유형: 582. 리눅스 디스크 공간 부족 및 safemode 부팅 방법
... [76]  77  78  79  80  81  82  83  84  85  86  87  88  89  90  ...