Microsoft MVP성태의 닷넷 이야기
오류 유형: 59. WPF - XAML 로딩 시 Visual Studio 비정상 종료 [링크 복사], [링크+제목 복사],
조회: 22298
글쓴 사람
정성태 (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

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13407정성태9/4/20233592닷넷: 2139. C# - ParallelEnumerable을 이용한 IEnumerable에 대한 병렬 처리
13406정성태9/4/20233561VS.NET IDE: 186. Visual Studio Community 버전의 라이선스
13405정성태9/3/20233988닷넷: 2138. C# - async 메서드 호출 원칙
13404정성태8/29/20233547오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/20233336오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
13402정성태8/20/20233441닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler
13401정성태8/19/20233669닷넷: 2136. .NET 5+ 환경에서 P/Invoke의 성능을 높이기 위한 SuppressGCTransition 특성 [1]
13400정성태8/10/20233499오류 유형: 874. 파이썬 - pymssql을 윈도우 환경에서 설치 불가
13399정성태8/9/20233474닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/20234303스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
13397정성태7/23/20233796닷넷: 2134. C# - 문자열 연결 시 string.Create를 이용한 GC 할당 최소화
13396정성태7/22/20233510스크립트: 54. 파이썬 pystack 소개 - 메모리 덤프로부터 콜 스택 열거
13395정성태7/20/20233419개발 환경 구성: 685. 로컬에서 개발 중인 ASP.NET Core/5+ 웹 사이트에 대해 localhost 이외의 호스트 이름으로 접근하는 방법
13394정성태7/16/20233373오류 유형: 873. Oracle.ManagedDataAccess.Client - 쿼리 수행 시 System.InvalidOperationException
13393정성태7/16/20233560닷넷: 2133. C# - Oracle 데이터베이스의 Sleep 쿼리 실행하는 방법
13392정성태7/16/20233457오류 유형: 872. Oracle - ORA-01031: insufficient privileges
13391정성태7/14/20233506닷넷: 2132. C# - sealed 클래스의 메서드를 callback 호출했을 때 인라인 처리가 될까요?
13390정성태7/12/20233453스크립트: 53. 파이썬 - localhost 호출 시의 hang 현상
13389정성태7/5/20233482개발 환경 구성: 684. IIS Express로 호스팅하는 웹을 WSL 환경에서 접근하는 방법
13388정성태7/3/20233610오류 유형: 871. 윈도우 탐색기에서 열리지 않는 zip 파일 - The Compressed (zipped) Folder '[...].zip' is invalid. [1]파일 다운로드1
13387정성태6/28/20233644오류 유형: 870. _mysql - Commands out of sync; you can't run this command now
13386정성태6/27/20233714Linux: 61. docker - 원격 제어를 위한 TCP 바인딩 추가
13385정성태6/27/20233933Linux: 60. Linux - 외부에서의 접속을 허용하기 위한 TCP 포트 여는 방법
13384정성태6/26/20233662.NET Framework: 2131. C# - Source Generator로 해결하는 enum 박싱 문제파일 다운로드1
13383정성태6/26/20233419개발 환경 구성: 683. GPU 런타임을 사용하는 Colab 노트북 설정
13382정성태6/25/20233482.NET Framework: 2130. C# - Win32 API를 이용한 윈도우 계정 정보 (예: 마지막 로그온 시간)파일 다운로드1
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...