목차 일부
추천의 글 ... ⅳ
아마존 독자서평 ... ⅴ
저자에 대하여 ... ⅵ
옮긴이 서문 ... ⅶ
들어가며 ... xvii
1장 문제 해결 우수 기법과 초반 조사 ... 1
1.1 시작 ... 1
1.2 효과적으로 문제를 분석하기 위한 시스템 준비 ... 2
1.3 네 단계 조사 과정 ... 3
1.3.1 1단계: 자기 힘으로 초반...
더보기
목차 전체
추천의 글 ... ⅳ
아마존 독자서평 ... ⅴ
저자에 대하여 ... ⅵ
옮긴이 서문 ... ⅶ
들어가며 ... xvii
1장 문제 해결 우수 기법과 초반 조사 ... 1
1.1 시작 ... 1
1.2 효과적으로 문제를 분석하기 위한 시스템 준비 ... 2
1.3 네 단계 조사 과정 ... 3
1.3.1 1단계: 자기 힘으로 초반 조사 수행 ... 5
1.3.2 2단계: 효과적인 인터넷 검색 ... 9
1.3.3 3단계: 심도 있는 조사 수행(우수한 문제 조사 기법) ... 12
1.3.4 4단계: 도움/아이디어 얻기 ... 21
1.4 기술적 조사 ... 28
1.4.1 증상과 원인 ... 28
1.5 상용제품 문제해결 방법 ... 39
1.6 결론 ... 40
2장 strace와 시스템 호출 추적 ... 41
2.1 개요 ... 41
2.2 strace란? ... 41
2.2.1 커널 측면에서 이해하기 ... 45
2.2.2 언제 strace를 사용할까? ... 48
2.2.3 간단한 예제 ... 49
2.2.4 동일한 예제를 정적으로 빌드한 경우 ... 53
2.3 주요 strace 옵션 ... 54
2.3.1 자식 프로세스 추적 ... 54
2.3.2 시스템 호출 활동 시간 측정 ... 55
2.3.3 상세 출력 모드 ... 58
2.3.4 실행 중인 프로세스 추적 ... 60
2.4 strace 영향과 고려 사항 ... 60
2.4.1 strace와 EINTR ... 61
2.5 디버깅 실례 ... 62
2.5.1 LD_LIBRARY_PATH 경로를 수정하여 시작 시간 줄이기 ... 62
2.5.2 PATH 환경 변수 ... 65
2.5.3 inetd 또는 xinetd(수퍼 서버) 추적하기 ... 66
2.5.4 통신 오류 ... 68
2.5.5 strace로 정지 상태 조사하기 ... 69
2.5.6 역공학(strace 도구가 동작하는 방식) ... 71
2.6 시스템 호출 추적 예제 ... 75
2.6.1 예제 코드 ... 75
2.6.2 시스템 호출 추적 코드 설명 ... 87
2.7 결론 ... 88
3장 /proc 파일시스템 ... 89
3.1 개요 ... 89
3.2 프로세스 정보 ... 90
3.2.1 /proc/self ... 90
3.2.2 /proc/〈pid〉 세부 사항 ... 91
3.2.3 /proc/〈pid〉/cmdline ... 107
3.2.4 /proc/〈pid〉/environ ... 107
3.2.5 /proc/〈pid〉/mem ... 107
3.2.6 /proc/〈pid〉/fd ... 107
3.2.7 /proc/〈pid〉/mapped_base ... 108
3.3 커널 정보와 조작 ... 109
3.3.1 /proc/cmdline ... 109
3.3.2 /proc/config.gz 또는 /proc/sys/config.gz ... 109
3.3.3 /proc/cpufreq ... 110
3.3.4 /proc/cpuinfo ... 110
3.3.5 /proc/devices ... 110
3.3.6 /proc/kcore ... 111
3.3.7 /proc/locks ... 111
3.3.8 /proc/meminfo ... 111
3.3.9 /proc/mm ... 112
3.3.10 /proc/modules ... 112
3.3.11 /proc/net ... 112
3.3.12 /proc/partitions ... 112
3.3.13 /proc/pci ... 113
3.3.14 /proc/slabinfo ... 113
3.4 시스템 정보와 조작 ... 113
3.4.1 /proc/sys/fs ... 114
3.4.2 /proc/sys/kernel ... 115
3.4.3 /proc/sys/vm ... 120
3.5 결론 ... 120
4장 컴파일 ... 121
4.1 개요 ... 121
4.2 GCC ... 121
4.2.1 GCC의 간단한 역사 ... 121
4.2.2 GCC 버전 호환성 ... 122
4.3 기타 컴파일러 ... 123
4.4 리눅스 커널 컴파일 ... 123
4.4.1 커널 원시 코드 얻기 ... 124
4.4.2 아키텍처 관련 원시 코드 ... 124
4.4.3 커널 컴파일 오류 처리하기 ... 125
4.4.4 일반적인 컴파일 문제 ... 128
4.5 어셈블리 목록 ... 134
4.5.1 어셈블리 목록의 목적 ... 134
4.5.2 어셈블리 목록 생성하기 ... 136
4.5.3 어셈블리 목록 읽기와 이해하기 ... 137
4.6 컴파일러 최적화 ... 140
4.7 결론 ... 150
5장 스택 ... 151
5.1 개요 ... 151
5.2 실생활에 비유한 예제 ... 152
5.3 x86/x86-64 아키텍처 스택 ... 153
5.4 스택 프레임이란? ... 157
5.5 스택 동작 방식 ... 159
5.5.1 BP와 SP 레지스터 ... 159
5.5.2 함수 호출 규약 ... 162
5.6 스택 자료 참조와 수정 ... 171
5.7 디버거로 스택 보기 ... 173
5.8 스택 이해하기 ... 176
5.8.1 직접 설계한 스택 역추적 기능 ... 180
5.9 결론 ... 192
6장 GNU 디버거(GDB) ... 193
6.1 개요 ... 193
6.2 디버거를 사용하는 시점 ... 194
6.3 명령행 편집 ... 195
6.4 GDB로 프로세스 제어하기 ... 196
6.4.1 GDB 명령행에서 프로그램 실행하기 ... 197
6.4.2 GDB에 실행 중인 프로세스 붙이기 ... 199
6.4.3 core 파일 사용하기 ... 201
6.5 데이터, 메모리, 레지스터 확인하기 ... 204
6.5.1 메모리 맵 ... 204
6.5.2 스택 ... 206
6.5.3 메모리와 변수 확인하기 ... 210
6.5.4 레지스터 덤프 ... 217
6.6 실행 ... 220
6.6.1 기본 명령 ... 221
6.6.2 실행 제어 명령을 위한 환경설정 ... 223
6.6.3 정지점 ... 228
6.6.4 감시점 ... 230
6.6.5 정지 시 표현식 출력 ... 234
6.6.6 공유 라이브러리로 작업하기 ... 235
6.7 원시 코드 ... 238
6.8 어셈블리 언어 ... 240
6.9 팁과 기교 ... 241
6.9.1 프로세스 붙이기: 다시 한번 돌아보기 ... 241
6.9.2 변수와 함수의 주소 찾기 ... 244
6.9.3 디버그 심볼이 없는 프로그램에서 구조체 보기 ... 246
6.9.4 엔디언 방식 이해하고 다루기 ... 250
6.10 C++ 디버깅 ... 252
6.10.1 전역 생성자와 소멸자 ... 252
6.10.2 인라인 함수 ... 256
6.10.3 예외 ... 257
6.11 스레드 ... 260
6.11.1 스택 공간 부족 ... 265
6.12 DDD ... 266
6.12.1 데이터 표시 윈도우 ... 268
6.12.2 원시 코드 윈도우 ... 273
6.12.3 기계어 윈도우 ... 273
6.12.4 GDB 콘솔 윈도우 ... 274
6.13 결론 ... 274
7장 리눅스 시스템 비정상 종료와 정지 ... 275
7.1 개요 ... 275
7.2 정보 수집 ... 275
7.2.1 syslog 설명 ... 276
7.2.2 직렬 콘솔 준비하기 ... 278
7.2.3 직렬 널 모뎀 케이블 연결하기 ... 278
7.2.4 컴퓨터 시작 과정에서 직렬 콘솔 활성화하기 ... 279
7.2.5 SysRq 커널 마법 키 활용하기 ... 281
7.2.6 웁스 보고서 ... 281
7.2.7 수동 커널 트랩 추가하기 ... 281
7.2.8 웁스 보고서 검사하기 ... 284
7.2.9 실패한 코드 행 찾아내기 ... 289
7.2.10 커널 웁스와 하드웨어 ... 293
7.2.11 cscope로 커널 원시 코드 색인하기 ... 294
7.3 결론 ... 296
8장 KDB를 사용한 커널 디버깅 ... 297
8.1 개요 ... 297
8.2 KDB 활성화하기 ... 298
8.3 KDB 활용하기 ... 299
8.3.1 KDB 시작하기 ... 299
8.3.2 일반 동작으로 복귀하기 ... 300
8.3.3 기본적인 명령어 ... 301
8.4 결론 ... 306
9장 ELF ... 307
9.1 개요 ... 307
9.2 개념과 정의 ... 309
9.2.1 심볼 ... 309
9.2.2 목적 파일, 공유 라이브러리, 실행 파일, 코어 파일 ... 311
9.2.3 링킹 ... 314
9.2.4 런타임 링킹 ... 318
9.2.5 프로그램 인터프리터/런타임 링커 ... 318
9.3 ELF 헤더 ... 318
9.4 세그먼트와 섹션 개괄 ... 324
9.5 세그먼트와 프로그램 헤더 테이블 ... 325
9.5.1 텍스트와 데이터 세그먼트 ... 329
9.6 섹션과 섹션 헤더 테이블 ... 331
9.6.1 문자열 테이블 형식 ... 335
9.6.2 심볼 테이블 형식 ... 335
9.6.3 섹션 이름과 유형 ... 338
9.7 재배치와 위치 독립 코드 ... 363
9.7.1 PIC와 PIC가 아닌 경우 비교 ... 363
9.7.2 재배치와 위치 독립 코드 ... 366
9.7.3 재배치와 링킹 ... 367
9.8 ELF 목적파일에서 디버깅 정보 제거하기 ... 371
9.9 프로그램 해석기 ... 372
9.9.1 링크 지도 ... 376
9.10 심볼 결정 ... 377
9.11 문제 분석을 위한 약한 심볼 활용 ... 382
9.12 GOT를 활용한 고급 가로채기 ... 386
9.13 원시 파일 ... 390
9.14 ELF API ... 392
9.15 기타 정보 ... 392
9.16 결론 ... 392
부록 A 디버깅 도구 상자 ... 393
A.1 개요 ... 393
A.2 프로세스 정보와 디버깅 ... 393
A.2.1 도구: GDB ... 393
A.2.2 도구: ps ... 394
A.2.3 도구: strace(system call tracer) ... 394
A.2.4 도구: /proc 파일시스템 ... 394
A.2.5 도구: DDD(Data Diplay Debugger) ... 394
A.2.6 도구: lsof(List Open Files) ... 395
A.2.7 도구: ltrace(library call tracer) ... 395
A.2.8 도구: time ... 395
A.2.9 도구: top ... 396
A.2.10 도구: pstree ... 396
A.3 네트워크 ... 396
A.3.1 도구: traceroute ... 396
A.3.2 File: /etc/hosts ... 396
A.3.3 File: /etc/services ... 397
A.3.4 도구: netstat ... 397
A.3.5 도구: ping ... 397
A.3.6 도구: telnet ... 397
A.3.7 도구: host/nslookup ... 398
A.3.8 도구: ethtool ... 398
A.3.9 도구: ethereal ... 398
A.3.10 File: /etc/nsswitch.conf ... 398
A.3.11 File: /etc/resolv.conf ... 399
A.4 시스템 정보 ... 399
A.4.1 도구: vmstat ... 399
A.4.2 도구: iostat ... 399
A.4.3 도구: nfsstat ... 400
A.4.4 도구: sar ... 400
A.4.5 도구: syslogd ... 400
A.4.6 도구: dmesg ... 401
A.4.7 도구: mpstat ... 401
A.4.8 도구: procinfo ... 401
A.4.9 도구: xosview ... 402
A.5 파일과 목적 파일 ... 402
A.5.1 도구: file ... 402
A.5.2 도구: ldd ... 402
A.5.3 도구: nm ... 402
A.5.4 도구: objdump ... 403
A.5.5 도구: od ... 403
A.5.6 도구: stat ... 403
A.5.7 도구: readelf ... 403
A.5.8 도구: strings ... 404
A.6 커널 ... 404
A.6.1 도구: KDB ... 404
A.6.2 도구: KGDB ... 404
A.6.3 도구: ksymoops ... 405
A.7 기타 ... 405
A.7.1 도구: VMWare 워크스테이션 ... 405
A.7.2 도구: VNC 서버 ... 405
A.7.3 도구: VNC 뷰어 ... 406
부록 B 자료 수집 스크립트 ... 407
B.1 개요 ... 407
B.1.1 -thorough ... 409
B.1.2 -perf, -hang〈pid〉, -trap, -error〈cmd〉 ... 409
B.2 스크립트 돌리기 ... 410
B.3 스크립트 소스코드 ... 411
B.4 면책 조항 ... 419
찾아보기 ... 421
옮긴이 주 ... 434
베타리더 한 마디 ... 444
더보기 닫기