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

... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13104정성태7/23/202211070Linux: 51. WSL - init에서 systemd로 전환하는 방법
13103정성태7/22/20227541오류 유형: 818. WSL - systemd-genie와 관련한 2가지(systemd-remount-fs.service, multipathd.socket) 에러
13102정성태7/19/20227035.NET Framework: 2033. .NET Core/5+에서는 구할 수 없는 HttpRuntime.AppDomainAppId
13101정성태7/15/202216106도서: 시작하세요! C# 10 프로그래밍
13100정성태7/15/20228447.NET Framework: 2032. C# 11 - shift 연산자 재정의에 대한 제약 완화 (Relaxing Shift Operator)
13099정성태7/14/20228377.NET Framework: 2031. C# 11 - 사용자 정의 checked 연산자파일 다운로드1
13098정성태7/13/20226542개발 환경 구성: 647. Azure - scale-out 상태의 App Service에서 특정 인스턴스에 요청을 보내는 방법 [1]
13097정성태7/12/20225920오류 유형: 817. Golang - binary.Read: invalid type int32
13096정성태7/8/20228845.NET Framework: 2030. C# 11 - UTF-8 문자열 리터럴
13095정성태7/7/20226861Windows: 208. AD 도메인에 참여하지 않은 컴퓨터에서 Kerberos 인증을 사용하는 방법
13094정성태7/6/20226624오류 유형: 816. Golang - "short write" 오류 원인
13093정성태7/5/20227481.NET Framework: 2029. C# - HttpWebRequest로 localhost 접속 시 2초 이상 지연
13092정성태7/3/20228452.NET Framework: 2028. C# - HttpWebRequest의 POST 동작 방식파일 다운로드1
13091정성태7/3/20227413.NET Framework: 2027. C# - IPv4, IPv6를 모두 지원하는 서버 소켓 생성 방법
13090정성태6/29/20226430오류 유형: 815. PyPI에 업로드한 패키지가 반영이 안 되는 경우
13089정성태6/28/20226907개발 환경 구성: 646. HOSTS 파일 변경 시 Edge 브라우저에 반영하는 방법
13088정성태6/27/20225849개발 환경 구성: 645. "Developer Command Prompt for VS 2022" 명령행 환경의 폰트를 바꾸는 방법
13087정성태6/23/20228965스크립트: 41. 파이썬 - FastAPI / uvicorn 호스팅 환경에서 asyncio 사용하는 방법 [1]
13086정성태6/22/20228426.NET Framework: 2026. C# 11 - 문자열 보간 개선 2가지파일 다운로드1
13085정성태6/22/20228533.NET Framework: 2025. C# 11 - 원시 문자열 리터럴(raw string literals)파일 다운로드1
13084정성태6/21/20226943개발 환경 구성: 644. Windows - 파이썬 2.7을 msi 설치 없이 구성하는 방법
13083정성태6/20/20227576.NET Framework: 2024. .NET 7에 도입된 GC의 메모리 해제에 대한 segment와 region의 차이점 [2]
13082정성태6/19/20226635.NET Framework: 2023. C# - Process의 I/O 사용량을 보여주는 GetProcessIoCounters Win32 API파일 다운로드1
13081정성태6/17/20226590.NET Framework: 2022. C# - .NET 7 Preview 5 신규 기능 - System.IO.Stream ReadExactly / ReadAtLeast파일 다운로드1
13080정성태6/17/20227306개발 환경 구성: 643. Visual Studio 2022 17.2 버전에서 C# 11 또는 .NET 7.0 preview 적용
13079정성태6/17/20224892오류 유형: 814. 파이썬 - Error: The file/path provided (...) does not appear to exist
... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...