[Economi] Moonlight AppImage 무응답(Hang) 진단 및 QT_QPA_PLATFORM=xcb 우회 조치 기록
초록
GNOME Wayland + 하이브리드 GPU(Intel/NVIDIA) 환경에서 Moonlight Game Streaming AppImage 클라이언트가 실행 중 무응답 상태에 빠지는 증상을 진단한다. 프로세스 상태(futex_do_wait), Tailscale 페어링 호스트 접근성(ping/포트 체크)을 통해 네트워크 문제를 배제하고, 번들 Qt의 네이티브 Wayland 렌더링 실패로 원인을 좁혀 QT_QPA_PLATFORM=xcb(XWayland 강제)로 우회한 조치 과정을 기록한다.
[Economi] Moonlight AppImage 무응답(Hang) 진단 및 QT_QPA_PLATFORM=xcb 우회 조치 기록
개요
2026-09-02, 로컬 워크스테이션(hb5u, Intel Arrow Lake-P + NVIDIA GeForce RTX 5060 하이브리드 GPU, GNOME Wayland 세션)에 설치된 Moonlight Game Streaming 클라이언트(AppImage 6.1.0)가 실행 중 응답 없음(hang) 상태에 빠지는 증상을 진단하고, Wayland 네이티브 렌더링 우회(QT_QPA_PLATFORM=xcb)로 해결한 과정을 기록한다.
배경
사령관 요청으로 먼저 ~/Applications/Moonlight-6.1.0-x86_64.AppImage를 확보하고, 바탕화면(~/Desktop/moonlight.desktop) 및 앱 메뉴(~/.local/share/applications/)에 실행 아이콘을 등록했다(아이콘은 AppImage 내부에 포함된 공식 SVG를 --appimage-extract로 추출해 재사용). 이후 실제 실행 시 클라이언트 창이 응답하지 않는다는 신고를 받아 진단에 착수했다.
증상
- Moonlight 실행 후 UI가 멈춰 입력에 반응하지 않음("클라이언트가 멈춰있어")
- 프로세스 자체는 종료되지 않고 계속 떠 있는 상태
진단
1. 프로세스 상태 확인
ps aux | grep -i moonlight
메인 프로세스(AppImage 런타임 + 실제 바이너리, 총 25개 스레드)가 살아있음을 확인. /proc/<pid>/status의 State는 S (sleeping)이었고, /proc/<pid>/wchan은 futex_do_wait — 스레드가 뮤텍스/컨디션 변수 대기 중임을 나타내는, UI 스레드 블로킹의 전형적 신호였다.
2. 페어링된 호스트 확인
~/.config/Moonlight Game Streaming Project/Moonlight.conf의 [hosts] 섹션에서 기존에 페어링된 호스트를 확인:
hostname = cmg-V16
manualaddress = 100.115.227.5 (Tailscale CGNAT 대역)
manualport = 47989
Moonlight는 실행 시 기존에 페어링된 호스트에 접속해 앱 목록을 갱신하려 시도하므로, 이 호스트로의 네트워크 접근성이 hang의 원인일 가능성을 우선 검증했다.
3. 네트워크 접근성 검증
tailscale status → cmg-v16: active; direct connection (정상 연결)
ping -c 3 100.115.227.5 → 0% packet loss, RTT 9~33ms
/dev/tcp/100.115.227.5/47989 → OPEN
결과: 네트워크/호스트 접근성은 문제 없음. 즉 hang의 원인은 원격 호스트 unreachable이 아니라, 클라이언트 자체의 렌더링/이벤트 루프 문제로 판단을 좁혔다.
4. 디버깅 한계
strace -p <pid>로 실시간 syscall을 확인하려 했으나 샌드박스 정책상 ptrace(PTRACE_SEIZE)가 거부되어(명령을 허용하지 않음) 상세 스택 추적은 불가능했다. wmctrl/xdotool로 창 상태를 조회했으나 GNOME Wayland 세션 특성상 결과가 나오지 않아 창 자체의 활성/응답 여부는 직접 확인하지 못했다.
원인 추정 및 조치
AppImage에 번들된 Qt(6.x, QML 기반 Moonlight UI)가 GNOME Wayland 세션에서 네이티브 Wayland 백엔드로 구동될 때, 하이브리드 GPU(Intel + NVIDIA) 환경과의 렌더링 서페이스 초기화 과정에서 멈추는 것은 moonlight-qt/Qt-AppImage 조합에서 잘 알려진 증상이다. 이를 우회하기 위해 XWayland 강제 구동을 시도했다:
# 기존 프로세스 종료
kill <pid>; pkill -9 -f Moonlight-6.1.0
# XWayland 백엔드로 재실행
env QT_QPA_PLATFORM=xcb /home/moos/Applications/Moonlight-6.1.0-x86_64.AppImage
재실행 후 프로세스 상태를 재확인한 결과 정상적으로 S (sleeping)(정상 대기, 이벤트 루프 유휴 상태) 상태였고 에러 로그 없이 기동되었다. 사령관 측 화면에서 창 응답 여부 최종 확인을 요청했다.
후속 조치 제안
- 바탕화면/앱 메뉴 런처의
Exec라인을env QT_QPA_PLATFORM=xcb /home/moos/Applications/Moonlight-6.1.0-x86_64.AppImage로 변경해, 매 실행마다 XWayland 모드가 기본 적용되도록 고정 - 근본 원인(번들 Qt의 네이티브 Wayland 렌더링 실패)은 AppImage 자체의 문제이므로, 후속 버전 업데이트 시 재발 여부 재확인 필요
ptrace기반 정밀 진단이 필요한 경우 샌드박스 밖(직접 터미널) 환경에서strace/gdb로 재현하는 절차를 별도 마련 권장
참고
- 실행 환경:
hb5u(Intel Arrow Lake-P + NVIDIA GeForce RTX 5060 Max-Q, GNOME/Wayland, Tailscale 메시 네트워크) - 페어링 호스트:
cmg-v16(Sunshine GameStream 호스트, Tailscale IP 100.115.227.5) - 진단 도구:
ps//proc/<pid>/status,/proc/<pid>/wchan,tailscale status,ping,/dev/tcp포트 체크
