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

... [106]  107  108  109  110  111  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11374정성태11/27/201728375사물인터넷: 14. 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정 [1]
11373정성태11/27/201727606오류 유형: 433. Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
11372정성태11/25/201729588사물인터넷: 13. 윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법 [4]
11371정성태11/25/201723309오류 유형: 432. Hyper-V 가상 스위치 생성 시 Failed to connect Ethernet switch port 0x80070002 오류 발생
11370정성태11/25/201724004오류 유형: 431. Hyper-V의 Virtual Switch 생성 시 "External network" 목록에 특정 네트워크 어댑터 항목이 없는 경우
11369정성태11/25/201725336사물인터넷: 12. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠) [1]
11368정성태11/25/201730112.NET Framework: 699. UDP 브로드캐스트 주소 255.255.255.255와 192.168.0.255의 차이점과 이를 고려한 C# UDP 서버/클라이언트 예제 [2]파일 다운로드1
11367정성태11/25/201731169개발 환경 구성: 337. 윈도우 운영체제의 route 명령어 사용법
11366정성태11/25/201723350오류 유형: 430. 이벤트 로그 - Cryptographic Services failed while processing the OnIdentity() call in the System Writer Object.
11365정성태11/25/201723758오류 유형: 429. 이벤트 로그 - User Policy could not be updated successfully
11364정성태11/24/201727804사물인터넷: 11. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표) [2]
11363정성태11/23/201727965사물인터넷: 10. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법 (두 번째 이야기)
11362정성태11/22/201722505오류 유형: 428. 윈도우 업데이트 KB4048953 - 0x800705b4 [2]
11361정성태11/22/201725502오류 유형: 427. 이벤트 로그 - Filter Manager failed to attach to volume '\Device\HarddiskVolume??' 0xC03A001C
11360정성태11/22/201726768오류 유형: 426. 이벤트 로그 - The kernel power manager has initiated a shutdown transition.
11359정성태11/16/201725511오류 유형: 425. 윈도우 10 Version 1709 (OS Build 16299.64) 업그레이드 시 발생한 문제 2가지
11358정성태11/15/201731390사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작 [1]
11357정성태11/15/201731707개발 환경 구성: 336. 윈도우 10 Bash 쉘에서 C++ 컴파일하는 방법
11356정성태11/15/201733439사물인터넷: 8. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법 [4]
11355정성태11/15/201727336사물인터넷: 7. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 [2]파일 다운로드2
11354정성태11/14/201733202사물인터넷: 6. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드로 쓰는 방법 [8]
11353정성태11/14/201729712사물인터넷: 5. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 이더넷 카드로 쓰는 방법 [1]
11352정성태11/14/201726642사물인터넷: 4. Samba를 이용해 윈도우와 Raspberry Pi간의 파일 교환 [1]
11351정성태11/7/201728735.NET Framework: 698. C# 컴파일러 대신 직접 구현하는 비동기(async/await) 코드 [6]파일 다운로드1
11350정성태11/1/201725178디버깅 기술: 108. windbg 분석 사례 - Redis 서버로의 호출을 기다리면서 hang 현상 발생
11349정성태10/31/201726010디버깅 기술: 107. windbg - x64 SOS 확장의 !clrstack 명령어가 출력하는 Child SP 값의 의미 [1]파일 다운로드1
... [106]  107  108  109  110  111  112  113  114  115  116  117  118  119  120  ...