32. Thread Information Block (TIB)
FS:[0x04] Stack Base / Bottom of stack
FS:[0x08] Stack Limit / Ceiling of stack
From http://en.wikipedia.org/wiki/Win32_Thread_Information_Block
x86에선 FS, x64에선 GS에 저장
NtQueryInformationThread 함수로
TIB 주소를 얻어올 수 있음
37. JYP 서버 - 수집
asio 서버로 수집
컨트롤러로 인증을 하면 모듈 등록을 시작한다.
컨트롤러를 통해
한 번의 시작/멈춤을 기준으로
분석 작업을 생성
38. JYP 서버 - 분석
수집된 내용을 분석하는 자식 프로세스 생성
DbgHelp.dll 의 함수들을 이용하여 분석
Process Id를 임의로 주면
실제 프로세스 없이
메모리 정보만 가지고 분석할 수 있다.
39. SymLoadModule64
DbgHelp에 분석하려는 덤프에 있는
모듈의 이름, 메모리 상 위치, 크기를 알려줌
SymGetSymFromAddr64
SymGetLineFromAddr64
StackWalk64의 결과로 부터
함수 이름과 줄 위치를 얻어옴
40. StackWalk64
주어진 메모리 정보와
레지스터들이 저장된 CONTEXT로 부터
콜스택을 분석한다.
ReadMemoryRoutine을 커스텀 버전으로 대체
StackWalk64 분석과정에서 코드 영역을 읽어 콜스택
분석에 사용하기 때문에 각 모듈의 이미지 정보도
필요하다.
41. JYP 서버 – 결과 조회
Crow + AngularJS
Deep, Self sample개수 순 정렬
Call graph보여주기
모듈, 쓰레드 필터링
49. 구현 상의 삽질 (1)
매번 미니 덤프 생성하는 방식 시도
느려서 교체 (초당 10회 수준)
스택 시작 주소를 얻기 위해
VirtualQueryEx로 ESP부터 올라가며
읽기 가능한 페이지 인지 확인했었다
실제 스택보다 더 크게 계산
50. 구현 상의 삽질 (2)
스택의 binary diff 만 전송 시도
diff 크기가 압축에 비해 훨씬 작다
binary diff 생성이 심각하게 느림
snappy 압축만으로 충분히 작아서 해결
가끔 데드락 발생하던 문제 수정
SuspendThread + 메모리 할당
54. 그리고 더 앞으로...
넥슨 라이브인프라 실의
실시간 모니터링 시스템을 통한 연계
상황별 정보 (현재 게임 상태, FPS 등)
특정 퀘스트나 맵에서 렉 유발
→ 유저 불만 발생 → 개발팀 인식
→ 서버에 상황 등록
→ 재현시 자동으로 성능 정보 수집 모님의 우주정복 계획 (?)
55. QnA
라이브 프로파일러 JYP
게임 클라이언트에 JYP 심어두기
컨트롤러 프로그램으로 시작/중지
수집한 내용을 서버로 전송 후 분석
웹 인터페이스를 통해 결과 확인