1. 개요
WPF 을 개발하면 Xaml Designer 를 통해서 윈도우의 디자인을 구성하게 됩니다. 이때 프로그램 실행에는 문제가 없으나 개발을 진행하면서 어느 순간 Designer가 에러가 발생하여 Control을 제대로 렌더링하지 못하게 되는 경우가 있습니다.
일반 Runtime 에서의 디버깅은 Debug 모드에서 충분히 할 수 있지만, Desinger에서 발생하는 문제같은 경우에는 디버깅하기가 쉽지 않습니다.
이를 해결하는 방법을 알아보도록 합니다. 해당 내용은 Visual Studio 2022를 기준으로 합니다.
2. Designer 프로세스 알아보기
WPF 의 Designer는 어떻게 동작하는 걸까요?
WPF Designer도 Application 실행과 비슷하게 내부적으로 'Microsoft Visual Studio XAML Designer'를 실행하는 프로세스를 동작하여 Runtime 과 동일하게 컨트롤의 화면을 렌더링합니다.
해당 프로세스는 이름이 'WpfSurface.exe' 입니다.
프로세스의 동작을 알았으니 방법은 간단합니다.
3. XAML Designer 디버깅
간단히 말하면 'Attach Process'를 통해서 XAML Designer를 디버깅하는 것입니다.
예제 프로젝트로 설명하하겠습니다.
위의 MainWindow에 DebuggingControl 이름의 UserControl를 생성하여 넣었지만, Designer에서 에러가 발생하여 Control이 보여지지 않고 있습니다. 바로 내부에서 발생한 exception 때문입니다.
내부적인 에러는 프로젝트에 따라 달라지지만 디버깅 모드로 진입만 할 수 있다면 문제는 쉬워집니다.
먼저 디버깅할 어플리케이션을 새로운 Visual Studio 에서 엽니다. 이것을 VS2 이라고 지칭하겠습니다. 바로 디버깅할 타겟 어플리케이션입니다. 기존의 Visual Studio를 VS1이라고 하고 디버거 역할을 합니다.
그리고 VS1의 Xaml 탭을 모두 닫아줍니다. VS2에서만 Xaml 을 열어 WpfSurface.exe 프로세스를 한 곳에서만 실행되도록 록 하기 위해서 입니다.
확실하게 하기 위해서 작업관리자에서 XAML Designer가 여러개 보인다면 모든 VS에서 Xaml 창을 닫고 Designer프로세스를 종료 한 후 VS2의 Xaml 디자이너 하나만 열어줍니다.
그리고 에러가 Control의 생성자 위치나 의심되는 위치에 VS1에서 Brake point를 잡아줍니다.
그리고 VS1에서 Debug -> Attach to Process 를 실행하여 WpfSurface.exe 를 찾아서 Attatch 합니다.
그리고 난 후 Designer 에서 reload 를 수행하면 Brake point에서 디버깅이 잡힌 것을 확인할 수 있습니다.
필요한 조치를 취한 뒤에 꼭 다시 빌드를 하고나면 정상적으로 Control 이 표시되는 것을 확인 할 수 있습니다.
4. 마무리
Runtime에서 정상적으로 동작한다는 이유로 Designer의 오류가 있어도 무시하고 진행하는 경우가 많았는데 이를 통해서 쉽게 디버깅하면 문제 파악이 훨씬 쉬워지게 될것 같습니다.
참조 : How to Debug the Design Time Errors in WPF XAML File? - CodeProject