Connect를 누르면 프로필이 잠시 돌아가고 클라이언트가 연결 끊김을 보고합니다. 지원팀이 로그를 요청하고, 스크린샷을 첨부해도 핸드셰이크의 어느 단계에서 포기했는지 아무도 말할 수 없어 스레드는 이틀 동안 멈춥니다. 한 번의 시도를 중심으로 좁은 시간 창과 마지막으로 완료된 단계를 담은 보고서라면 티켓은 한 번의 왕복으로 앞으로 나아갑니다. 대신 하루치 휴대폰 로그를 보내면 대개 상대방이 살펴볼 곳만 늘어납니다.

같은 게이트웨이에 있는 두 휴대폰도 프로토콜, 인증서 저장소, 인증 방식, 트래픽 정책이 일치하지 않을 수 있어 다르게 동작할 수 있습니다. 내 기기에서는 된다는 말은 비교의 출발점일 뿐 안드로이드 결함의 증거가 아닙니다.

하루치 기록이 아니라 한 번의 시도를 기록하기

무엇이든 재현하기 전에 안드로이드 릴리스, 제조사와 모델, 클라이언트 이름과 버전, 선택한 프로필, 연결된 네트워크, 시간대를 포함한 시각을 적어 둡니다. 배터리 절약이나 Data Saver가 켜져 있는지도 적는 이유는 둘 다 화면이 꺼진 뒤 클라이언트가 할 수 있는 일을 바꾸기 때문입니다.

그다음 다섯 가지 결과 중 실제로 무엇을 보고 있는지 정합니다. 동의나 권한 창이 끝나지 않거나, 엔드포인트에 아예 닿지 않거나, 인증이 거부되거나, 로그인 성공 후 인터페이스 설정이 실패하거나, 터널은 올라오지만 특정 리소스만 닿지 않는 경우입니다. 각각 담당자와 해결책이 다르고, 이를 섞은 묶음은 다시 해 보라는 답을 받습니다. 그 사이에서 추측하는 것이 한 시간짜리 티켓을 일주일짜리 왕복으로 바꿉니다.

전환도 중요합니다. 화면 잠금 후나 Wi-Fi에서 모바일 데이터로 넘어간 뒤에만 실패한다면 티켓 첫 줄에 적고 몇 분에 일어났는지 기록하세요.

먼저 클라이언트 자체 로그를 내보내기

첫 첨부는 운영체제가 아니라 앱에서 가져와야 합니다. 대부분의 클라이언트는 설정에 진단 로그나 연결 로그 내보내기를 제공하며, 때로는 버전 문자열을 길게 눌러야 나오고, 그 출력은 이미 자체 상태 기계를 이해합니다. 흥미로운 줄을 티켓 본문에 다시 입력하지 말고 나온 그대로 사용하세요.

마지막 연결 끊김 줄만이 아니라 첫 오류와 그 직전 이벤트를 첨부합니다. 끝이 깨끗하다는 것은 보통 검증되지 않은 인증서 체인, 예상치 못한 곳에서 확인된 이름, 설정되지 않은 인터페이스처럼 진짜 실패가 더 앞에서 일어났다는 뜻입니다.

이름 붙일 수 있는 질문에만 logcat 추가하기

휴대폰의 터미널 에뮬레이터는 시스템 로거가 아닙니다. 안드로이드는 각 버퍼를 권한 있는 프로세스만 전체를 읽을 수 있는 별도의 링 버퍼 스트림으로 기록합니다. 그래서 일반 앱은 자기 출력과 제한된 조각만 보게 되고, logcat이 비어 있었다는 말은 플랫폼이 무엇을 기록했는지 거의 증명하지 못합니다.

지원되는 경로는 직접 관리하는 컴퓨터에서 권한을 승인한 ADB 세션이며, 개발자 옵션과 USB 디버깅을 켜고 케이블을 연결한 뒤 기기에서 RSA 지문 대화상자를 수락하는 것입니다. 이 프롬프트를 닫으면 이후 모든 명령이 unauthorized로 실패하고 캡처는 시작되지 않습니다.

캡처에 시간을 쓰기 전에 기기가 정말 있는지 확인합니다. adb devices는 시리얼 번호 뒤에 device라는 단어를 출력해야 하고, offline나 unauthorized가 보이면 먼저 케이블, 프롬프트, 드라이버를 정리해야 합니다.

목록에 나타나면 Connect를 누르기 몇 초 전부터 캡처를 시작하고 클라이언트가 포기한 직후 멈추는 편이 이십 분 뒤에 뜬 덤프보다 나은데, 이는 링 버퍼가 이미 돌아 필요한 초반 줄이 사라졌을 수 있기 때문입니다:

adb logcat -v threadtime -b main,system,crash > attempt.txt

VPN이라는 단어가 아니라 시간과 태그로 필터링하기

캡처에서 vpn을 검색하는 것은 실패를 설명하는 줄을 잃는 가장 빠른 길입니다. 인증서 검증, 프로세스 충돌, 연결성 변화는 VPN을 언급하지 않는 태그로 기록되므로 키워드 필터는 잡음만 남기고 증거를 버립니다.

먼저 시간 범위를, 다음 우선순위를, 마지막으로 태그를 좁힙니다. 알려진 시점 이후만 필요하면 adb logcat -v threadtime -t '11-03 20:14:00.000'가 그 지점부터 최근 꼬리를 재생하고, threadtime 형식이면 타임스탬프를 클라이언트 자체 내보내기와 비교할 수 있습니다.

클라이언트 패키지를 안다면 태그를 추측하지 말고 그 프로세스를 따릅니다. adb shell pidof com.vendor.client는 PID를 반환하고 adb logcat --pid=1234 -v threadtime는 그 프로세스만 출력하며, adb logcat -g는 각 버퍼가 덮어쓰기를 시작하기 전에 얼마나 여유가 있는지 보여 줍니다.

비밀을 가린 뒤 하나의 일관된 묶음으로 넘기기

무엇이든 내 컴퓨터를 떠나기 전에 암호, 토큰, 개인 키, 세션 쿠키, 전체 기기 식별자를 제거합니다. 실패를 읽을 수 있게 만드는 오류 코드, 이벤트 순서, 주소 관계는 남기는데, 그 선을 넘겨 정리한 캡처는 한 번도 필터링하지 않은 캡처만큼 쓸모없기 때문입니다.

그다음 여러 개의 흩어진 파일 대신 하나의 묶음으로 보냅니다. 클라이언트 내보내기, 시작과 중지 시각으로 이름 붙인 ADB 창, 실패한 단계의 두 줄 요약, 이 목록 맨 위의 환경 메모가 그 내용입니다.

보내기 전에 네 가지를 확인합니다. 묶음이 반나절 전체가 아니라 한 번의 시도를 다루나요? 클라이언트와 시스템 타임스탬프가 겹치나요? 그리고 아직 토큰, 암호, 전체 가입자 식별자가 들어 있나요? 마지막 항목을 먼저 고친 뒤 새 티켓을 열지 말고 기존 티켓에 파일을 첨부해, 이어받는 사람이 이전 맥락을 유지하게 합니다.

관련 글