Windows 2003 터미널 서비스 세션에서 Copy & Paste가 불규칙적으로 동작하지 않는 현상
Windows 2003 터미널 서비스 세션에서 Local Client로 또는 Local Client에서 Windows 2003 터미널 서비스 세션으로 copy & paste가 동작하지 않는 현상이 간헐적으로 발생할 수 있습니다. 이 문제 증상을 이해하기 위해서는 Windows에서 Clipboard가 어떻게 동작하는지 내부 동작 메커니즘을 이해해야 할 필요가 있습니다. Clipboard 동작과 관련한 주요 문제는 Clipboard viewer chain 과 관련이 있습니다. Clipboard viewer chain이란 local clipboard의 변경 사항에 대한 알림을 받기 원하는 응용 프로그램들의 연결 리스트입니다. 즉, Clipboard viewer chain에 등록된 응용 프로그램 만이 clipboard의 변경 사항에 대해서 업데이트를 받게 됩니다. 그러나, 여기서 Windows clipboard chain 동작 메카니즘 상의 중요한 주의 사항이 있습니다. Clipboard viewer chain은 OS 시스템이 아닌 application 들에 의하여 control되는 메커니즘을 가지고 있습니다. 즉, Clipboard viewer chain에 등록된 application들은 Clipboard 가 정상적으로 동작하기 위하여 아래와 같은 작업을 할 책임이 있습니다.
“응용 프로그램은 Clipboard 의 업데이트 내용을 받은 후, 체인의 그 다음 viewer에게 알림 전달”
예를 들어, 현재 시스템의 Clipboard viewer 체인에 아래 4개의 application이 등록되어 있는 경우,
A -> B -> C -> D (RDPCLIP.exe)
Clipboard에 update가 발생하면, 시스템은 첫번째 viewer인 A 응용 프로그램에게 Clipboard 변경 메시지를 전달하게 됩니다. A응용 프로그램은 Clipboard 메시지를 받은 후, 그 알림 내용을 B 응용 프로그램에게 알릴 필요가 있습니다. 또한, B 응용 프로그램은 Clipboard 메시지를 전달 받은 후, 그 다음 viewer인 C 응용 프로그램에게 메시지를 전달하게 됩니다. 또한, C 응용 프로그램은 D응용 프로그램에게 Clipboard 메시지를 전달해야 합니다. 예를 들어, A, B, C는 사용자 응용 프로그램이고, D 는 터미널 서비스 세션에서 Clipboard 동작을 관린하는 RDPCLIP.exe 라고 할 수 있습니다.
이 상태에서 C 응용 프로그램이 Clipboard viewer chain 에서 빠져 나오고자 할 경우, 정상적인 경우는 아래와 같은 clipboard chain이 형성되어 있어야 합니다.
A -> B -> D (RDPCLIP.exe)
그러나, 어떤 이유로 C 응용 프로그램은 종료되었으나, 아래 와 같이 Clipboard viewer chain 에 C 응용 프로그램 정보가 여전히 남아 있다면, Clipboard viewer chain은 깨지게 되고, 터미널 서비스 세션과 local client에서 copy & paste가 동작하지 않는 문제 증상이 발생할 수 있습니다. 왜냐하면, clipboard 업데이트 메시지를 받은 B 응용 프로그램은 C 응용 프로그램에게 메시지를 전달하게 되는데, C 응용 프로그램은 이미 종료된 상태이기 때문입니다.
A -> B -> C -> D (RDPCLIP.exe)
그럼, C 응용 프로그램은 종료되었으나, Clipboard viewer chain 에 C 응용 프로그램 정보가 남아 있을 수 있는 경우는 어떤 경우에 발생할 수 있을까요? 다음은 그런 문제 상황을 설명합니다.
Clipboard 데이터는 공유 데이터로서, 특정 한 순간에는 하나의 응용 프로그램에서만 접근해야 합니다. (이는 멀티 태스크 환경에서 동기화 문제를 의미합니다.) 그러나, 아래와 같이 RDPCLIP.exe가 Clipboard 데이터를 열거하는 동안 응용 프로그램 C가 clipboard chain으로부터 빠져나오기 위해 clipbaord에 접근한다면, 실패하게 됩니다. 이 경우, 응용 프로그램 C는 Clipboard chain의 접근에 실패한 것을 체크하고, 다시 한번 시도를 해야 하지만 이를 체크하지 않고, 응용 프로그램 C가 종료되는 경우, 위와 같은 문제 상황이 발생할 수 있게 됩니다.
1. App C in the remote session opens the clipboard.
2. App C in the remote session copies data to the clipboard.
3. App C in the remote session closes the clipboard.
4. RDPCLIP is notified that the clipboard has been updated.
5. RDPCLIP opens the clipboard to enumerate through the data types.
6. RDPCLIP begins to enumerate through the data types.
7. App C in the remote session tries to open the clipboard.
8. RDPCLIP finishes enumerating through the data types.
9. App C in the remote session fails to open the clipboard.
10. RDPCLIP closes the clipboard.
다른 동기화 문제와 마찬가지로 이와 같은 문제 증상은 버그를 가지고 있는 응용 프로그램 C가 실행 중이 하더라도 항상 문제 증상이 발생하는 것은 아닙니다. 이는 동기화 문제를 일으킬 수 있는 Timing 조건 (Racing Condition)이 충족되었을 경우에만 발생하여 아주 불규칙적인 패턴으로 문제 증상이 발생하게 되는 것입니다.
결론적으로 말씀 드리면, 이 문제는 Clipboard viewer chain을 깨는 버그 응용프로그램에 의하여 발생하게 됩니다. 물론, Windows 의 Clipboard 동작 메커니즘이 응용 프로그램의 오동작에 의하여 깨질 수 있다는 Clipboard 디자인 상의 약점에 대하여 Windows Clipboard 동작 메커니즘이 비난 받을 수는 있을 것입니다. 저희 마이크로소프트 기술지원부서에도 이 문제에 대하여 본사 개발부서로 이 문제에 대한 개선을 요청하였으나, 이는 간단한 hot fix 형태로 문제를 해결할 수 없는 제품의 디자인 자체를 변경해야 하는 부분이기 때문에 hot fix의 요청은 거절되었고, 다음 버전의 Windows에서는 디자인을 변경하도록 결정되었습니다. 실제, Windows 2008 서버와 Windows Vista 클라이언트를 사용하는 경우, 응용 프로그램에 의해 제어되던 Clipboard의 동작 메커니즘은 Windows의 서브 시스템이 제어하도록 변경되었고, 위에서 설명 드린 문제점은 발생하지 않는 것으로 보고되어 있습니다.
[참고 자료]
Why does my shared clipboard not work? (Part 1)
http://blogs.msdn.com/rds/archive/2006/11/16/why-does-my-shared-clipboard-not-work-part-1.aspx
Why does my shared clipboard not work? (Part 2)
http://blogs.msdn.com/rds/archive/2006/11/20/why-does-my-shared-clipboard-not-work-part-2.aspx
Windows 2003 서버 / Windows XP 클라이언트 환경에서 이 문제 증상이 발생할 경우, 문제 증상을 해결할 수 있는 방법은, Client에서 RDP 세션을 disconnect 후 다시 connect할 수 있습니다. 이 경우, 깨어진 Clipboard viewer chain 에 RDPCLIP.exe가 다시 등록되기 때문에 Clipboard가 다시 동작할 수 있게 됩니다. 또는 Windows 2008 Server와 Windows Vista로 업그레이드할 실 경우, Clipboard 동작 메커니즘이 향상되어 응용 프로그램에 의한 Clipboard viewer chain의 깨짐 현상을 방지할 수 있습니다.