책 소개
이 책은 2006~2007년 DumpAnalysis.org 블로그에 포스팅된 글 중 일부를 골라 교정과 편집을 하고, 그 내용을 서로 참조해 주제별로 엮은 것이다. 참고 문헌으로 사용되길 바라며 앞으로의 내 책에서도 인용할 예정이다.
이 책은 다음과 같은 경우에 유용하게 사용될 수 있다.
■ 윈도우 플랫폼에서 제품을 개발하고 유지 보수하는 소프트웨어 엔지니어
■ 기술 지원 부서와 복잡한 소프트웨어 이슈를 다루는 에스컬레이션(escalation) 엔지니어
■ 또한 일반 윈도우 사용자가 흥미를 느끼는 글도 있을 것이다.
[ 이 책에서 다루는 내용 ]
■ 실무에서 경험하는 다양한 크래시 덤프 분석 패턴
■ 초보자를 위한 각 사례별 크래시 덤프 분석 기법
■ 각 사례별 덤프 분석 도구의 사용법
■ 다양한 관점에서 바라보는 크래시 덤프 파일의 분석 기법
[ 추천의 글 ]
국내외에 많은 디버깅 관련 출판물이 있지만 대부분 내용이 입문서 수준이거나 아니면 매우 포괄적인 주제를 다루는 개념서에 그치고 있다. 반면에 이 책은 디버깅을 할 때 직면하는 일반적인 사항은 물론, 손상된 덤프와 메모리에서부터 단계적으로 원인 분석을 위한 다양한 기법에 이르기까지, 개발자가 쉽게 경험할 수 없었던 디버깅 관련 내용을 주제 별로 심도 있게 때로는 흥미진진하게 다룬다. 윈도우 프로그래밍이나 시스템 프로그래밍 등에 관심 있거나 관련 일을 하는 개발자라면 누구에게나 가장 실용적이며 실무적인 안내서 역할을 해주는 길잡이가 될 것이다.
이 책은 다음과 같은 경우에 유용하게 사용될 수 있다.
■ 윈도우 플랫폼에서 제품을 개발하고 유지 보수하는 소프트웨어 엔지니어
■ 기술 지원 부서와 복잡한 소프트웨어 이슈를 다루는 에스컬레이션(escalation) 엔지니어
■ 또한 일반 윈도우 사용자가 흥미를 느끼는 글도 있을 것이다.
[ 이 책에서 다루는 내용 ]
■ 실무에서 경험하는 다양한 크래시 덤프 분석 패턴
■ 초보자를 위한 각 사례별 크래시 덤프 분석 기법
■ 각 사례별 덤프 분석 도구의 사용법
■ 다양한 관점에서 바라보는 크래시 덤프 파일의 분석 기법
[ 추천의 글 ]
국내외에 많은 디버깅 관련 출판물이 있지만 대부분 내용이 입문서 수준이거나 아니면 매우 포괄적인 주제를 다루는 개념서에 그치고 있다. 반면에 이 책은 디버깅을 할 때 직면하는 일반적인 사항은 물론, 손상된 덤프와 메모리에서부터 단계적으로 원인 분석을 위한 다양한 기법에 이르기까지, 개발자가 쉽게 경험할 수 없었던 디버깅 관련 내용을 주제 별로 심도 있게 때로는 흥미진진하게 다룬다. 윈도우 프로그래밍이나 시스템 프로그래밍 등에 관심 있거나 관련 일을 하는 개발자라면 누구에게나 가장 실용적이며 실무적인 안내서 역할을 해주는 길잡이가 될 것이다.
김점갑 / 안철수 연구소 기반기술팀 수석연구원, 에이콘 윈도우 시스템 프로그래밍 시리즈 에디터
목차
목차
- 1장 크래시 덤프
- 크래시 덤프란?
- 올바른 크래시 덤프
- 크래시란?
- 행이란?
- 심볼 파일이란?
- 크래시와 행의 차이
- 선행적 크래시 덤프
- 2장 전문적인 크래시 덤프 분석
- 미니 덤프 분석
- 스크립트와 WinDbg 명령
- 컴포넌트 식별
- 로 스택 데이터 분석
- 심볼과 이미지
- 인터럽트와 예외에 대한 설명
- 예외 설명에 앞서
- X86 인터럽트
- x64 인터럽트
- 인터럽트 프레임과 스택 재구성
- X86 트랩 명령
- x64 트랩 명령
- 유저 모드의 예외
- 첫 번째와 두 번째 예외를 구별하는 방법
- 포스트모텀 디버거는 누가 호출하는가?
- 비스타 에러 리포팅의 구조
- 페이지 폴트에 대한 다른 시각
- 몇 가지 버그체크
- NMIHARDWAREFAILURE
- IRQLNOTLESSOREQUAL
- KERNELMODEEXCEPTIONNOTHANDLED
- KMODEEXCEPTIONNOT_HANDLED
- SYSTEMTHREADEXCEPTIONNOTHANDLED
- CAFF
- CF
- 스택 트레이스를 재구성하는 방법
- WinDbg 팁과 트릭
- 덤프에서 문자열 찾기
- 프로세스를 디버깅하는 중에 Win32 API 추적
- 익스포트된 NTDLL과 커널 구조체
- 간단한 리스트 탐색
- 스레드 일시 중지
- 힙 스택 트레이스
- 하이퍼텍스트 명령
- 행 분석을 빠르게
- 삼중 역참조
- 건초 더미에서 바늘 찾기
- 스택 트레이스 추정하기
- 없는 심볼 정보 복사
- 심볼 메시지 해결
- 태그 검색
- 오래된 덤프, 새로운 익스텐션
- 객체 이름과 대기 중인 스레드
- 가상 이미지에서의 메모리 덤프
- 프로세스 필터링
- WinDbg 스크립트
- 첫 번째 스크립트
- 기타 WinDbg 스크립트
- 데드락과 크리티컬 섹션
- 보안 문제
- 수백 개의 크래시 덤프
- 매개변수를 가진 스크립트
- 보안 이슈와 스크립트
- 모든 스레드의 로 스택 덤프(프로세스 덤프)
- 모든 스레드의 로 스택 덤프(컴플리트 덤프)
- 사례 연구
- 코드 안의 루프 탐지
- 크래시 덤프 분석 체크리스트
- 크래시 덤프 분석 포스터(HTML 버전)
- 미니 덤프 분석
- 3장 크래시 덤프 분석 패턴
- 다중 예외
- 동적 메모리 훼손
- 긍정 오류 덤프
- 외측 손상
- 최적화된 코드
- 유효하지 않은 포인터
- 일치하지 않는 덤프
- 숨겨진 예외
- 데드락(크리티컬 섹션)
- 변화된 환경
- 부정확한 스택 트레이스
- OMAP 코드 최적화
- 컴포넌트 심볼 없음
- 불충분한 메모리(커밋된 메모리)
- 스파이킹 스레드
- 모듈 다양성
- 스택 오버플로우(커널)
- 데드락(익스큐티브 리소스)
- 불충분한 메모리(핸들 릭)
- 관리된 코드 예외
- 잘려진 덤프
- 스레드 대기 시간
- 데드락(혼합된 객체들)
- 메모리 누수(프로세스 힙)
- 잃어버린 스레드
- 알려지지 않은 컴포넌트
- 메모리 누수(닷넷 힙)
- 이중 해제(프로세스 힙)
- 이중 해제(커널 풀)
- 우연히 일치하는 심볼 정보
- 스택 트레이스
- 가상화된 프로세스(WOW64)
- 스택 트레이스 모음
- 결합된 프로세스
- 극심한 경쟁
- 우연한 락
- 수동적인 스레드(유저 공간)
- 메인 스레드
- 불충분한 메모리(커널 풀)
- 분주한 시스템
- 역사적 정보
- IRP 분포 이상
- 지역 버퍼 오버플로우
- 수동적인 시스템 스레드(커널 공간)
- 초기 크래시 덤프
- 후킹된 함수
- 사용자 정의 예외 핸들러
- 데드락(LPC)
- 특별한 스택 트레이스
- 수동 덤프(커널)
- 대기 체인(일반적인)
- 수동 덤프(프로세스)
- 대기 체인(크리티컬 섹션)
- 4장 크래시 덤프 분석 안티 패턴
- 외래 컴포넌트
- ZIPPOCRICY
- 입소문
- 잘못된 덤프
- 문제 기술서 무시
- 크래시 덤프가 필요한데...
- ‘~이다’의 사용
- 축약어에 속다
- 5장 과학적 접근
- 메모리 덤프 - 수학적 정의
- 추상 공간에 꼬여있는 끈과 같은 스레드
- 메모리 덤프 분석이란?
- 메모릴리온과 쿼드메모릴리온
- 크래시 덤프의 네 가지 원인
- 복잡성과 메모리 덤프
- 소프트웨어 결함이란?
- 6장 재미있는 크래시 덤프
- 덤프 분석과 음성 인식
- 덤프와 함께 짧은 메시지 보내기
- 계산기도 되는 WinDbg
- 덤프와 디버거, 가상화
- 뮤지컬 덤프
- 디버거를 디버깅하기
- 뮤지컬 덤프: Dump2Wave
- 덤프 토모그래피
- 가장 작은 프로그램
- 프로세스 공간에서의 음성
- 크래시 덤프 분석 명함
- 컴퓨터 메모리 듣기
- 메모리 덤프 가시화
- 메모리 누수 가시화
- 컴퓨터 메모리 그리기
- 유니코드 보기
- 2진에서 10진으로의 변환법 가르치기
- 크래시 덤프와 글로벌 음모
- 7장 GDB와 WinDbg
- AT&T와 인텔 구문
- 설치
- 디스어셈블러
- 스택 트레이스(백 트레이스)
- 지역변수
- 8장 소프트웨어 트러블슈팅
- 네 개의 기둥
- 5개의 황금 룰
- 비판적인 사고
- 디버깅할 때의 트러블슈팅
- 9장 시트릭스 사
- 풀태그
- 시트릭스 사의 서비스 목록
- 시트릭스 사의 씬와이어 리버스 엔지니어링
- 10장 보안
- 메모리 시각화
- WinDbg는 개인 정보 친화적
- 크래시 덤프와 보안
- 11장 크래시 덤프의 근원
- JIT 서비스 디버깅
- 비스타에서의 지역 크래시 덤프
- COM+ 크래시 덤프
- userdump.exe에 대한 마이크로소프트 사의 기사 정정
- 어디서 발생한 크래시 덤프인가?
- 비스타의 사용자 정의 포스트모텀 디버거
- 비스타에서 Dr. Watson의 부활
- 프로세스 충돌 - 수동으로 덤프 얻기
- Dr. Watson 업그레이드
- savedump.exe와 페이지 파일
- 비스타 덤프하기
- 중단 없이 프로세스 덤프하기
- 64비트에서의 userdump.exe
- X64 윈도우에서의 NTSD
- 덤프가 필요한가요? 공통 유스케이스
- 12장 툴
- 엑셀을 사용한 메모리 덤프 분석
- testdefaultdebugger.net
- 심볼 서버의 단점
- StressPrinters: 강제 프린터 자동 생성
- 인스턴트 덤프(JIT 프로세스 덤퍼)
- TestDefaultDebugger
- DumpAlerts
- DumpDepends
- 덤프 모니터 슈트
- SystemDump
- 13장 기타 여러 가지
- KiFastSystemCallRet이란?
- I/O 컴플리션 포트의 이해
- 심볼 파일 경고문
- 비스타에서 윈도우 서비스 크래시 덤프
- 커널 공간으로 가는 길
- 메모리 덤프 분석가 면접용 질문
- 디버깅할 때 듣기 좋은 음악
- PDBFinder
- 프로세스가 조용히 죽는 경우
- ASLR: 주소 공간 레이아웃 랜덤화
- 비스타에서 프로세스와 스레드의 시작
- 단일 프로세서 머신에서의 경쟁 조건
- ZW*와 NT* 함수 다시 보기
- 프로그래머 유니버설리스
- 닥터 왓슨 로그 분석
- 디버깅 이후의 난제
- 크래시 덤프 분석 스타일
- 비주얼 스튜디오에서 크래시 덤프 분석하기
- 64비트 덤프에 있는 32비트 스택
- 어셈피디아
- WINE이 크래시 덤프 분석에 도움이 되는 이유
- 레거시 디버깅의 공포
- UML과 디바이스 드라이버
- 통계학: 모든 프로세스에 걸쳐서 CPU가 100%인 경우
- 부록 A
- 크래시 덤프 분석 포털
- 크래시 덤프 분석 포털
- 부록 B