리눅스 문제 분석과 해결 [아무도 가르쳐주지 않았던 리눅스 실전 노하우]
- 원서명Self-Service Linux: Mastering the Art of Problem Determination (ISBN 9780131477513)
- 지은이Mark Wilding, Dan Behman
- 옮긴이박재호, 이해영
- ISBN : 8989975999
- 28,000원
- 2006년 09월 28일 펴냄 (절판)
- 페이퍼백 | 472쪽 | 190*250mm
- 시리즈 : 오픈소스 프로그래밍
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
모든 리눅스 관리자, 개발자, 지원 부서, 고급 사용자를 괴롭혀왔던 불가결의 문제 해결 길잡이가 드디어 출간되었다. 오류, 비정상 종료, 정지, 성능 저하, 기대하지 않은 행동 양식, 기대하지 않은 결과를 시스템적으로 파헤치며, strace, gdb, kdb, SysRq, /proc 등 핵심적인 리눅스 문제 해결 도구에 통달하는 방법을 알려준다.
[ 이 책의 특징 ]
드디어 모든 고급 사용자, 관리자, 개발자를 위한 구조적이며 실질적인 리눅스 문제 해결사가 등장했다. IBM의 선도 리눅스 전문가 두 명은 이 책에서 오류, 비정상 종료, 정지, 성능 저하, 기대하지 않은 행동 양식, 기대하지 않은 결과와 같은 모든 유형의 리눅스 관련 시스템이나 응용프로그램 문제를 찾아서 해결하기 위한 네 단계 방법론을 소개한다. 리눅스의 핵심 문제해결 도구를 사용해서 정확하게 문제를 손수 해결하며 리눅스 공동체에 퍼져있는 지식을 효과적으로 활용하는 방법을 배워보자.
리눅스를 업무에서 활용하는 사람이라면, 이 책은 효율성, 생산성, 시장성을 놀랄 만큼 높여줄 수 있다. 회사에서 리눅스를 배포하거나 관리하는 업무를 맡고 있다면, 이 책은 운영 비용을 절감하고, 중단 시간을 줄이고, ROI를 높이는 과정에서 도움을 준다.
▒ 리눅스 환경에서 문제를 파악하는 증명된 우수 기법을 찾는다
▒ 다른 플랫폼에서 습득한 문제 해결 지식을 지렛대로 삼는다
▒ 리눅스 문제 해결 도구 중에서 가장 널리 사용하는 strace로 문제를 찾는 방법을 배운다
▒ /proc을 활용해서 하드웨어, 커널, 프로세스에 얽힌 중요한 정보를 찾아낸다
▒ 오픈 소스 응용 프로그램에 디버그 정보를 붙여서 새로 컴파일한다
▒ C++와 스레드 응용 프로그램을 포함하여 gdb로 응용 프로그램을 디버그한다
▒ 커널 비정상 종료와 정지를 한번에 한 단계씩 디버깅한다
▒ ELF를 이해하고 더 효율적인 디버깅 과정에 이 지식을 활용한다
▒ 중요한 임무에 투입한 리눅스 시스템을 디버깅하는 과정에서 몇 시간이나 며칠을 절약하도록 상용 환경에 바로 투입 가능한 자료 수집 스크립트를 제공한다
[ 이 책의 구성 ]
이 책은 리눅스 환경에서 발생하는 문제를 효과적이면서도 효율적으로 진단하는 방법을 다룬다. 인터넷 상에 있는 정보와 자원을 활용하는 방법 등 우수한 조사 기법을 소개하고, 리눅스가 제공하는 가장 중요한 문제 진단 분석과 해결 도구의 사용법을 상세히 다룬다.
1장은 효과적인 문제 진단 분석과 해결 기법을 다루는 집중 강좌이다. 이 장을 익히고 나면 전문가처럼 문제를 진단할 수 있다. 흔히 발생하는 문제 유형을 조사하는 방법과 더불어, 인터넷 어디에서 어떻게 정보를 찾아야 하는지를 설명한다.
2장은 리눅스에서 문제 진단 분석과 해결 과정에 가장 흔히 사용하는 도구인 strace를 다룬다. 2장에서는 strace가 동작하는 방식을 상세히 소개할 뿐만 아니라 실용적인 사용법 정보도 다룬다. 또한 간단한 strace 도구의 소스코드를 소개하며, 기반 기능인 ptrace 인터페이스를 통해 커널과 동작하는 방식을 상세히 설명한다.
3장은 현재 시스템에서 실행 중인 하드웨어, 커널, 프로세스에 관련하여 방대한 정보를 포함하는 /proc 파일 시스템에 관한 내용이다. 주로 문제 진단 분석과 해결을 비롯하여 시스템 진단에 관련한 고급 기능과 기교를 소개하고 살펴본다. 예를 들어, /proc/sys/kernel/sysrq로 SysRq 커널 마법 키를 사용하는 방법을 다룬다.
4장은 컴파일을 다룬다. 디버깅 정보를 포함하도록 오픈 소스 응용 프로그램을 다시 컴파일해야 할지(대개는 다시 컴파일해야 한다), 어려운 문제일 경우 어셈블리 코드 목록을 생성해야 할지(이 방법으로 트랩이 걸린 코드 행을 찾는다), 리눅스 커널 자체를 다시 컴파일하는 과정에서 어떤 문제가 발생하는지 등에 관해 긴요한 정보를 제공한다.
5장은 컴퓨터 시스템에서 가장 중요하고도 기본적인 개념 중 하나인 스택을 속속들이 살펴본다. (리눅스 전문가라면 반드시 알아야 할) 스택 구조체를 상세히 설명하며, 또한 독자가 자신의 도구와 응용 프로그램에서 스택 추적을 생성하기 위해 사용할 수 있는 소스 코드를 소개하고 설명한다.
6장은 GNU 디버거인 GDB로 응용 프로그램을 디버깅하는 방법을 상세하고도 심도 있게 살펴본다. 또한 그래픽 유저 인터페이스인 DDD(Data Display Debugger)도 간략하게 소개한다. 또한 C++ 응용 프로그램 디버깅, 스레드 응용 프로그램 디버깅, 다양한 최고 디버깅 기법 등 흔히 접하기 어려운 정보를 상세히 다룬다.
7장은 시스템 충돌과 중단을 상세히 살펴본다. ‘직렬 콘솔을 연결하는 방법’부터 ‘커널 트랩(“웁스 Oops”)을 사용하여 코드 행을 찾는 방법’까지 필요한 내용을 다룬다.
8장은 커널 디버깅, 즉 커널 디버거 kdb를 사용한 디버깅을 좀더 상세히 다룬다. 시스템에서 kdb를 환경 설정하고 활성화하는 방법을 설명하며, 커널 전문가가 되지 않고도 대다수 리눅스 사용자가 활용할 수 있는 실용적인 명령을 소개한다.
9장은 ELF(Executable and Linking Format)를 상세하게 파헤친다. 기본적인 ELF 파일 형식에 관해 자세하고도 실용적인 정보를 제공하며, 극소수 개발자만이 알고 있는 비결과 기교를 소개한다. 심지어 LD_PRELOAD(으)로 함수를 재정의하는 법, GOT(global offset table)와 GDB 디버거로 함수를 직접 가로채서 디버그 버전으로 보내는 법 등을 예제 코드와 더불어 단계별로 설명한다.
부록 A는 리눅스에서 가장 유용한 도구, 기능, 파일을 개괄적으로 소개하는 디버깅 도구 상자이다. 각 도구마다 언제 사용하면 좋은지 그리고 어디서 최신 버전을 얻을 수 있는지를 설명하고 있다.
부록 B는 곧바로 사용할 수 있는 자료 수집 스크립트를 제공한다. 주요 핵심 업무를 다루는 시스템이나 리눅스 상에서 원격으로 고객을 지원하는 사용자에게 특히 유용하다. 자료 수집 스크립트만 있어도, 원격에서 발생한 문제를 디버깅하는 데 드는 시간을 크게 줄일 수 있다.
[ 이 책의 대상 ]
이 책은 모든 리눅스 사용자에게 유용한 정보를 제공하지만, 특히 리눅스 전문가를 염두에 두고 있다. 여기에는 리눅스 고급 사용자, 리눅스 관리자, 리눅스용 소프트웨어 개발자, 리눅스 제품 지원 인력 등이 포함된다. 가정에서 재미삼아 리눅스를 사용하는 독자에게도 도움이 된다. 물론 리눅스에 대한 기본적인 이해가 있거나 적어도 배우려는 의지가 있어야 한다. 여기서 후자가 더 중요하다.
[ 이 책의 특징 ]
드디어 모든 고급 사용자, 관리자, 개발자를 위한 구조적이며 실질적인 리눅스 문제 해결사가 등장했다. IBM의 선도 리눅스 전문가 두 명은 이 책에서 오류, 비정상 종료, 정지, 성능 저하, 기대하지 않은 행동 양식, 기대하지 않은 결과와 같은 모든 유형의 리눅스 관련 시스템이나 응용프로그램 문제를 찾아서 해결하기 위한 네 단계 방법론을 소개한다. 리눅스의 핵심 문제해결 도구를 사용해서 정확하게 문제를 손수 해결하며 리눅스 공동체에 퍼져있는 지식을 효과적으로 활용하는 방법을 배워보자.
리눅스를 업무에서 활용하는 사람이라면, 이 책은 효율성, 생산성, 시장성을 놀랄 만큼 높여줄 수 있다. 회사에서 리눅스를 배포하거나 관리하는 업무를 맡고 있다면, 이 책은 운영 비용을 절감하고, 중단 시간을 줄이고, ROI를 높이는 과정에서 도움을 준다.
▒ 리눅스 환경에서 문제를 파악하는 증명된 우수 기법을 찾는다
▒ 다른 플랫폼에서 습득한 문제 해결 지식을 지렛대로 삼는다
▒ 리눅스 문제 해결 도구 중에서 가장 널리 사용하는 strace로 문제를 찾는 방법을 배운다
▒ /proc을 활용해서 하드웨어, 커널, 프로세스에 얽힌 중요한 정보를 찾아낸다
▒ 오픈 소스 응용 프로그램에 디버그 정보를 붙여서 새로 컴파일한다
▒ C++와 스레드 응용 프로그램을 포함하여 gdb로 응용 프로그램을 디버그한다
▒ 커널 비정상 종료와 정지를 한번에 한 단계씩 디버깅한다
▒ ELF를 이해하고 더 효율적인 디버깅 과정에 이 지식을 활용한다
▒ 중요한 임무에 투입한 리눅스 시스템을 디버깅하는 과정에서 몇 시간이나 며칠을 절약하도록 상용 환경에 바로 투입 가능한 자료 수집 스크립트를 제공한다
[ 이 책의 구성 ]
이 책은 리눅스 환경에서 발생하는 문제를 효과적이면서도 효율적으로 진단하는 방법을 다룬다. 인터넷 상에 있는 정보와 자원을 활용하는 방법 등 우수한 조사 기법을 소개하고, 리눅스가 제공하는 가장 중요한 문제 진단 분석과 해결 도구의 사용법을 상세히 다룬다.
1장은 효과적인 문제 진단 분석과 해결 기법을 다루는 집중 강좌이다. 이 장을 익히고 나면 전문가처럼 문제를 진단할 수 있다. 흔히 발생하는 문제 유형을 조사하는 방법과 더불어, 인터넷 어디에서 어떻게 정보를 찾아야 하는지를 설명한다.
2장은 리눅스에서 문제 진단 분석과 해결 과정에 가장 흔히 사용하는 도구인 strace를 다룬다. 2장에서는 strace가 동작하는 방식을 상세히 소개할 뿐만 아니라 실용적인 사용법 정보도 다룬다. 또한 간단한 strace 도구의 소스코드를 소개하며, 기반 기능인 ptrace 인터페이스를 통해 커널과 동작하는 방식을 상세히 설명한다.
3장은 현재 시스템에서 실행 중인 하드웨어, 커널, 프로세스에 관련하여 방대한 정보를 포함하는 /proc 파일 시스템에 관한 내용이다. 주로 문제 진단 분석과 해결을 비롯하여 시스템 진단에 관련한 고급 기능과 기교를 소개하고 살펴본다. 예를 들어, /proc/sys/kernel/sysrq로 SysRq 커널 마법 키를 사용하는 방법을 다룬다.
4장은 컴파일을 다룬다. 디버깅 정보를 포함하도록 오픈 소스 응용 프로그램을 다시 컴파일해야 할지(대개는 다시 컴파일해야 한다), 어려운 문제일 경우 어셈블리 코드 목록을 생성해야 할지(이 방법으로 트랩이 걸린 코드 행을 찾는다), 리눅스 커널 자체를 다시 컴파일하는 과정에서 어떤 문제가 발생하는지 등에 관해 긴요한 정보를 제공한다.
5장은 컴퓨터 시스템에서 가장 중요하고도 기본적인 개념 중 하나인 스택을 속속들이 살펴본다. (리눅스 전문가라면 반드시 알아야 할) 스택 구조체를 상세히 설명하며, 또한 독자가 자신의 도구와 응용 프로그램에서 스택 추적을 생성하기 위해 사용할 수 있는 소스 코드를 소개하고 설명한다.
6장은 GNU 디버거인 GDB로 응용 프로그램을 디버깅하는 방법을 상세하고도 심도 있게 살펴본다. 또한 그래픽 유저 인터페이스인 DDD(Data Display Debugger)도 간략하게 소개한다. 또한 C++ 응용 프로그램 디버깅, 스레드 응용 프로그램 디버깅, 다양한 최고 디버깅 기법 등 흔히 접하기 어려운 정보를 상세히 다룬다.
7장은 시스템 충돌과 중단을 상세히 살펴본다. ‘직렬 콘솔을 연결하는 방법’부터 ‘커널 트랩(“웁스 Oops”)을 사용하여 코드 행을 찾는 방법’까지 필요한 내용을 다룬다.
8장은 커널 디버깅, 즉 커널 디버거 kdb를 사용한 디버깅을 좀더 상세히 다룬다. 시스템에서 kdb를 환경 설정하고 활성화하는 방법을 설명하며, 커널 전문가가 되지 않고도 대다수 리눅스 사용자가 활용할 수 있는 실용적인 명령을 소개한다.
9장은 ELF(Executable and Linking Format)를 상세하게 파헤친다. 기본적인 ELF 파일 형식에 관해 자세하고도 실용적인 정보를 제공하며, 극소수 개발자만이 알고 있는 비결과 기교를 소개한다. 심지어 LD_PRELOAD(으)로 함수를 재정의하는 법, GOT(global offset table)와 GDB 디버거로 함수를 직접 가로채서 디버그 버전으로 보내는 법 등을 예제 코드와 더불어 단계별로 설명한다.
부록 A는 리눅스에서 가장 유용한 도구, 기능, 파일을 개괄적으로 소개하는 디버깅 도구 상자이다. 각 도구마다 언제 사용하면 좋은지 그리고 어디서 최신 버전을 얻을 수 있는지를 설명하고 있다.
부록 B는 곧바로 사용할 수 있는 자료 수집 스크립트를 제공한다. 주요 핵심 업무를 다루는 시스템이나 리눅스 상에서 원격으로 고객을 지원하는 사용자에게 특히 유용하다. 자료 수집 스크립트만 있어도, 원격에서 발생한 문제를 디버깅하는 데 드는 시간을 크게 줄일 수 있다.
[ 이 책의 대상 ]
이 책은 모든 리눅스 사용자에게 유용한 정보를 제공하지만, 특히 리눅스 전문가를 염두에 두고 있다. 여기에는 리눅스 고급 사용자, 리눅스 관리자, 리눅스용 소프트웨어 개발자, 리눅스 제품 지원 인력 등이 포함된다. 가정에서 재미삼아 리눅스를 사용하는 독자에게도 도움이 된다. 물론 리눅스에 대한 기본적인 이해가 있거나 적어도 배우려는 의지가 있어야 한다. 여기서 후자가 더 중요하다.
목차
목차
- 1장 문제 해결 우수 기법과 초반 조사
- 1.1 시작
- 1.2 효과적으로 문제를 분석하기 위한 시스템 준비
- 1.3 네 단계 조사 과정
- 1.3.1 1단계: 자기 힘으로 초반 조사 수행
- 1.3.2 2단계: 효과적인 인터넷 검색
- 1.3.3 3단계: 심도 있는 조사 수행 (우수한 문제 조사 기법)
- 1.3.4 4단계: 도움/아이디어 얻기
- 1.4 기술적 조사
- 1.4.1 증상과 원인
- 1.5 상용제품 문제해결 방법
- 1.6 결론
- 2장 strace와 시스템 호출 추적
- 2.1 개요
- 2.2 strace란?
- 2.2.1 커널 측면에서 이해하기
- 2.2.2 언제 strace를 사용할까?
- 2.2.3 간단한 예제
- 2.2.4 동일한 예제를 정적으로 빌드한 경우
- 2.3 주요 strace 옵션
- 2.3.1 자식 프로세스 추적
- 2.3.2 시스템 호출 활동 시간 측정
- 2.3.3 상세 출력 모드
- 2.3.4 실행 중인 프로세스 추적
- 2.4 strace 영향과 고려 사항
- 2.4.1 strace와 EINTR
- 2.5 디버깅 실례
- 2.5.1 LDLIBRARYPATH 경로를 수정하여 시작 시간 줄이기
- 2.5.2 PATH 환경 변수
- 2.5.3 inetd 또는 xinetd (수퍼 서버) 추적하기
- 2.5.4 통신 오류
- 2.5.5 strace로 정지 상태 조사하기
- 2.5.6 역공학 (strace 도구가 동작하는 방식)
- 2.6 시스템 호출 추적 예제
- 2.6.1 예제 코드
- 2.6.2 시스템 호출 추적 코드 설명
- 2.7 결론
- 3장 /proc 파일시스템
- 3.1 개요
- 3.2 프로세스 정보
- 3.2.1 /proc/self
- 3.2.2 /proc/<pid> 세부 사항
- 3.2.3 /proc/<pid>/cmdline
- 3.2.4 /proc/<pid>/environ
- 3.2.5 /proc/<pid>/mem
- 3.2.6 /proc/<pid>/fd
- 3.2.7 /proc/<pid>/mapped_base
- 3.3 커널 정보와 조작
- 3.3.1 /proc/cmdline
- 3.3.2 /proc/config.gz 또는 /proc/sys/config.gz
- 3.3.3 /proc/cpufreq
- 3.3.4 /proc/cpuinfo
- 3.3.5 /proc/devices
- 3.3.6 /proc/kcore
- 3.3.7 /proc/locks
- 3.3.8 /proc/meminfo
- 3.3.9 /proc/mm
- 3.3.10 /proc/modules
- 3.3.11 /proc/net
- 3.3.12 /proc/partitions
- 3.3.13 /proc/pci
- 3.3.14 /proc/slabinfo
- 3.4 시스템 정보와 조작
- 3.4.1 /proc/sys/fs
- 3.4.2 /proc/sys/kernel
- 3.4.3 /proc/sys/vm
- 3.5 결론
- 4장 컴파일
- 4.1 개요
- 4.2 GCC
- 4.2.1 GCC의 간단한 역사
- 4.2.2 GCC 버전 호환성
- 4.3 기타 컴파일러
- 4.4 리눅스 커널 컴파일
- 4.4.1 커널 원시 코드 얻기
- 4.4.2 아키텍처 관련 원시 코드
- 4.4.3 커널 컴파일 오류 처리하기
- 4.4.4 일반적인 컴파일 문제
- 4.5 어셈블리 목록
- 4.5.1 어셈블리 목록의 목적
- 4.5.2 어셈블리 목록 생성하기
- 4.5.3 어셈블리 목록 읽기와 이해하기
- 4.6 컴파일러 최적화
- 4.7 결론
- 5장 스택
- 5.1 개요
- 5.2 실생활에 비유한 예제
- 5.3 x86/x86-64 아키텍처 스택
- 5.4 스택 프레임이란?
- 5.5 스택 동작 방식
- 5.5.1 BP와 SP 레지스터
- 5.5.2 함수 호출 규약
- 5.6 스택 자료 참조와 수정
- 5.7 디버거로 스택 보기
- 5.8 스택 이해하기
- 5.8.1 직접 설계한 스택 역추적 기능
- 5.9 결론
- 6장 GNU 디버거(GDB)
- 6.1 개요
- 6.2 디버거를 사용하는 시점
- 6.3 명령행 편집
- 6.4 GDB로 프로세스 제어하기
- 6.4.1 GDB 명령행에서 프로그램 실행하기
- 6.4.2 GDB에 실행 중인 프로세스 붙이기
- 6.4.3 core 파일 사용하기
- 6.5 데이터, 메모리, 레지스터 확인하기
- 6.5.1 메모리 맵
- 6.5.2 스택
- 6.5.3 메모리와 변수 확인하기
- 6.5.4 레지스터 덤프
- 6.6 실행
- 6.6.1 기본 명령
- 6.6.2 실행 제어 명령을 위한 환경설정
- 6.6.3 정지점
- 6.6.4 감시점
- 6.6.5 정지 시 표현식 출력
- 6.6.6 공유 라이브러리로 작업하기
- 6.7 원시 코드
- 6.8 어셈블리 언어
- 6.9 팁과 기교
- 6.9.1 프로세스 붙이기: 다시 한번 돌아보기
- 6.9.2 변수와 함수의 주소 찾기
- 6.9.3 디버그 심볼이 없는 프로그램에서 구조체 보기
- 6.9.4 엔디언 방식 이해하고 다루기
- 6.10 C++ 디버깅
- 6.10.1 전역 생성자와 소멸자
- 6.10.2 인라인 함수
- 6.10.3 예외
- 6.11 스레드
- 6.11.1 스택 공간 부족
- 6.12 DDD
- 6.12.1 데이터 표시 윈도우
- 6.12.2 원시 코드 윈도우
- 6.12.3 기계어 윈도우
- 6.12.4 GDB 콘솔 윈도우
- 6.13 결론
- 7장 리눅스 시스템 비정상 종료와 정지
- 7.1 개요
- 7.2 정보 수집
- 7.2.1 syslog 설명
- 7.2.2 직렬 콘솔 준비하기
- 7.2.3 직렬 널 모뎀 케이블 연결하기
- 7.2.4 컴퓨터 시작 과정에서 직렬 콘솔 활성화하기
- 7.2.5 SysRq 커널 마법 키 활용하기
- 7.2.6 웁스 보고서
- 7.2.7 수동 커널 트랩 추가하기
- 7.2.8 웁스 보고서 검사하기
- 7.2.9 실패한 코드 행 찾아내기
- 7.2.10 커널 웁스와 하드웨어
- 7.2.11 cscope로 커널 원시 코드 색인하기
- 7.3 결론
- 8장 KDB를 사용한 커널 디버깅
- 8.1 개요
- 8.2 KDB 활성화하기
- 8.3 KDB 활용하기
- 8.3.1 KDB 시작하기
- 8.3.2 일반 동작으로 복귀하기
- 8.3.3 기본적인 명령어
- 8.4 결론
- 9장 ELF
- 9.1 개요
- 9.2 개념과 정의
- 9.2.1 심볼
- 9.2.2 목적 파일, 공유 라이브러리, 실행 파일, 코어 파일
- 9.2.3 링킹
- 9.2.4 런타임 링킹
- 9.2.5 프로그램 인터프리터/런타임 링커
- 9.3 ELF 헤더
- 9.4 세그먼트와 섹션 개괄
- 9.5 세그먼트와 프로그램 헤더 테이블
- 9.5.1 텍스트와 데이터 세그먼트
- 9.6 섹션과 섹션 헤더 테이블
- 9.6.1 문자열 테이블 형식
- 9.6.2 심볼 테이블 형식
- 9.6.3 섹션 이름과 유형
- 9.7 재배치와 위치 독립 코드
- 9.7.1 PIC와 PIC가 아닌 경우 비교
- 9.7.2 재배치와 위치 독립 코드
- 9.7.3 재배치와 링킹
- 9.8 ELF 목적파일에서 디버깅 정보 제거하기
- 9.9 프로그램 해석기
- 9.9.1 링크 지도
- 9.10 심볼 결정
- 9.11 문제 분석을 위한 약한 심볼 활용
- 9.12 GOT를 활용한 고급 가로채기
- 9.13 원시 파일
- 9.14 ELF API
- 9.15 기타 정보
- 9.16 결론
- 부록 A 디버깅 도구 상자
- A.1 개요
- A.2 프로세스 정보와 디버깅
- A.2.1 도구: GDB
- A.2.2 도구: ps
- A.2.3 도구: strace (system call tracer)
- A.2.4 도구: /proc 파일시스템
- A.2.5 도구: DDD (Data Display Debugger)
- A.2.6 도구: lsof (List Open Files)
- A.2.7 도구: ltrace (library call tracer)
- A.2.8 도구: time
- A.2.9 도구: top
- A.2.10 도구: pstree
- A.3 네트워크
- A.3.1 도구: traceroute
- A.3.2 File: /etc/hosts
- A.3.3 File: /etc/services
- A.3.4 도구: netstat
- A.3.5 도구: ping
- A.3.6 도구: telnet
- A.3.7 도구: host/nslookup
- A.3.8 도구: ethtool
- A.3.9 도구: ethereal
- A.3.10 File: /etc/nsswitch.conf
- A.3.11 File: /etc/resolv.conf
- A.4 시스템 정보
- A.4.1 도구: vmstat
- A.4.2 도구: iostat
- A.4.3 도구: nfsstat
- A.4.4 도구: sar
- A.4.5 도구: syslogd
- A.4.6 도구: dmesg
- A.4.7 도구: mpstat
- A.4.8 도구: procinfo
- A.4.9 도구: xosview
- A.5 파일과 목적 파일
- A.5.1 도구: file
- A.5.2 도구: ldd
- A.5.3 도구: nm
- A.5.4 도구: objdump
- A.5.5 도구: od
- A.5.6 도구: stat
- A.5.7 도구: readelf
- A.5.8 도구: strings
- A.6 커널
- A.6.1 도구: KDB
- A.6.2 도구: KGDB
- A.6.3 도구: ksymoops
- A.7 기타
- A.7.1 도구: VMWare 워크스테이션
- A.7.2 도구: VNC 서버
- A.7.3 도구: VNC 뷰어
- 부록 B 자료 수집 스크립트
- B.1 개요
- B.1.1 -thorough
- B.1.2 -perf, -hang <pid>, -trap, -error <cmd>
- B.2 스크립트 돌리기
- B.3 스크립트 소스코드
- B.1 개요
관련 블로그 글
[신간] 리눅스 문제 분석과 해결
"번역서는 원서보다 못하다"는 이야기를 간혹 듣곤 합니다. 조금 다른 이야기이긴 하지만 "국산 영화는 눈뜨고 못봐줘" 이런 얘기만큼이나 제게 있어서는 받아들일 수 없는 발언입니다. 물론 저희 출판사에서 나오는 책들 중에도 원서의 난해함이나 편집자나 역자들의 실력과 노력 여하에 따라 원서의 말맛을 살리지 못하는 경우도 있곤 합니다...만!! 그래도 저희 에이콘 출판사에서는 언제나 원서보다 나은 훌륭한 번역서를 내기 위해 정말 열심히 노력을 합니다.
특히나 이 분들 박재호/이해영 P대 동창 콤비가 만들어내는 리눅스 책이라면?
오늘도 역시나 한발 앞선 사진으로 독자 여러분의 갈증을 해소해드리겠습니다.
추석 밑이어서 예약 주문을 하신 독자 여러분께는 각 서점마다 조금씩 다른 일정으로 배송될 것 같습니다. 마음이 급하신 분들은 어서 대형서점 오프라인 매장으로 달려가시길.. ^^;
『리눅스 디버깅과 성능 튜닝』과 함께 이 두 권으로 완벽한 리눅스 전문 고급 개발자의 경지에 다다르시길 기원합니다.
특히나 이 분들 박재호/이해영 P대 동창 콤비가 만들어내는 리눅스 책이라면?
수많은 원서의 오류(아마 100개는 될 겁니다 --;)를 찾아내고, 코드를 수정하고, 독자들이 읽기 편하도록 편집한 이번 신간 『리눅스 문제 분석과 해결』은 원서를 미리 산 독자들이 배가 아파 뒹굴 정도로 정말 열심히 만들었습니다.(물론! 오늘도 기우로 드리는 말씀이지만 간혹 나올 수 있는 오타나 오류는 언제라도 가차없이 해당 도서페이지의 오류 /오탈자 신고 창을 이용해 신고해주세요. ^^)
오늘도 역시나 한발 앞선 사진으로 독자 여러분의 갈증을 해소해드리겠습니다.
추석 밑이어서 예약 주문을 하신 독자 여러분께는 각 서점마다 조금씩 다른 일정으로 배송될 것 같습니다. 마음이 급하신 분들은 어서 대형서점 오프라인 매장으로 달려가시길.. ^^;
『리눅스 디버깅과 성능 튜닝』과 함께 이 두 권으로 완벽한 리눅스 전문 고급 개발자의 경지에 다다르시길 기원합니다.
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
[출간예정] 리눅스 문제 분석과 해결
(위 그림은 예약판매용 이미지이며, 실제 출간시 표지는 약간 바뀔 수 있습니다)
리눅스 개발자와 시스템 관리자, 고급 사용자들을 괴롭혀왔던 불가결한 문제들을 스스로 해결할 수 있도록 길잡이가 되어줄 수 있는 『리눅스 문제 분석과 해결- 아무도 가르쳐주지 않았던 리눅스 실전 노하우』가 9월 28일 출간됩니다(가격: 28,000원).
리눅스 운영체제와 관련 소프트웨어에서 나타나는 문제점과 버그를 스스로 찾아내어 문제를 해결할 수 있도록 훌륭한 길잡이를 하는 책
- PC Burn 서평
이 책은 단순한 옵션 나열이나 피상적인 명령어 사용법을 다루는 책이 아니다. 실제로 리눅스 전문 개발자들이 반드시 알고 넘어가야 하는 핵심적인 지식을 담고 있는 알짜 서적이다.
- 옮긴이 박재호
1장. "우수 문제 해결기법과 초반 조사"는 정말 감동적이다. 1장 내용만 충분히 숙지해도 이 책 값어치의 80%는 얻어낸 것이다.
- 옮긴이 이해영
이 책에 앞서 지난 2월에 출간된 『리눅스 디버깅과 성능 튜닝 - 오픈소스 도구를 사용한 문제 진단 분석과 해결』은 초급에서 중급 리눅스 개발자들이 현장에서 바로 응용할 수 있도록 리눅스에서 제공하는 다양한 도구 사용법과 활용방안을 포괄적인 개념의 리눅스 문제 해결 기법을 소개한 책이었습니다.
한편 금번에 출간되는 『리눅스 문제 분석과 해결』은 『리눅스 디버깅과 성능 튜닝』에서 아쉬웠던 점을 적절히 보완해주는 고급서로서, 문제 이면에 숨겨진 원리를 파악하게 해주는 심도 깊은 내용을 다루는 중급/고급 개발자를 위한 책이며, 리눅스 개발자, 테스터, 분석가, 시스템 관리자 누구나 꼭 봐야할 필수 서적이며, 스스로 문제를 해결하는 능력을 키우는 데 도움을 드릴 것입니다.
『조엘 온 소프트웨어』를 옮긴 박재호 / 이해영님이 『리눅스 디버깅과 성능 튜닝』에 이어 기획, 공역하신 이 책은 리눅스 전문가답게 단기간에 번역을 마치시고 현재는 도움을 주신 베타리더 들의 원고를 받아 마무리 작업 중에 있습니다.
미디어 서평, 책의 구성, 저자/역자 서문, 목차 등 자세한 내용은 도서 정보 페이지를 참조하시기 바랍니다.
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
도서 오류 신고
정오표
1쇄 오류/오탈자
[ p.viii 끝에서 두 번째 문단 4행 ]
(주의: 달리 원서 예제는 → (주의: 원서 예제는 번역서와는 달리
[ p.xxi 참고 2행 마침표 삭제 ]
http://www.phptr.com/title/013147751X. → http://www.phptr.com/title/013147751X
[ p.93 세 번째 문단 2-3행 ]
/bin/bash에, 주소 공간 0x08048000-01080b6000으로 사상되어
→ /bin/bash 실행파일이 주소 공간 0x08048000-01080b6000으로 사상되어
[ p.177 팁 박스 2행 ]
경계는 2NUM으로 계산한다.
→ 경계는 2NUM으로 계산한다.
[ p.177 아래에서 네 번째 행 ]
네 번째 워드는 주소가 0xbffff228c, 값은
→ 네 번째 워드는 주소가 0xbffff22c, 값은
[ p.178 첫 번째 코드 4행 ]
mov %esp, %ebp → movl %esp, %ebp
[ p.178 페이지 첫 번째 코드 8행 ]
0x08048424 <function2+16>: lea 0xfffffffc(%ebp), %eax
→ 0x08048424 <function2+16>: leal 0xfffffffc(%ebp), %eax
[ p.179 두 번째 문단 ]
0xbffff234, 0xbffff238, 0xbffff23c, 0xbffff40에 저장된
→ 0xbffff234, 0xbffff238, 0xbffff23c, 0xbffff240에 저장된
[ p.179 두 번째 문단 2행 ]
스택 포인터를 옮기는 subl 명령 두 개를 보면
→ 스택 포인터를 옮기는 sub 명령 두 개를 보면
[ p.183 2행, 4행 ]
-export-dynamic → --export-dynamic
[ p.183 1-3행에 대한 역자주 추가 ]
(독자 김홍숙님께서 의견 주셨습니다.)
-rdynamic 스위치는 gcc의 specs파일에 저장된 내용에 따라 링커 옵션 --export-dynamic 으로 변경된다. 다음과 같은 명령을 통해 확인할수 있다.
gcc -dumpspecs | grep rdynamic
%{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker %(dynamic_linker)}} %{static:-static}}}
[ p.198 마지막 코드 아래에서 4행 ]
(gdb) unset envrionment FOOs → (gdb) unset envrionment FOO
[ p.201 아래에서 11행 ]
현재 설정을 전부 보려면 -u 인수를 사용한다.
→ 현재 설정을 전부 보려면 -a 인수를 사용한다.
[ p.203 마지막 행 ]
core-pattern에 대한 자세한 설명은
→ core_pattern에 대한 자세한 설명은
[ p.247 코드 네 번째 행 foo 함수의 return 직전 문장 ]
pEmp->manager_emp_no=10;
→ pEmp->is_ceo=1;
[ p.248 아래에서 3행 ]
0x08048372 <foo+6>: movl $0x10, 0x4 (%eax)
→ 0x08048372 <foo+6>: movl $0x1, 0x4 (%eax)
[ p.295 마지막 행 ]
cscope -d -P /usr/src/$dbpath -p 20 -f /usr/src/$dbpath/cscope.out fi
→ cscope -d -P /usr/src/$dbpath -p 20 -f /usr/src/$dbpath/cscope.out
fi
[ p.315 마지막 행 ]
g++ -o foo main.o -L. -Wl,-rpath, -lfoo
→ g++ -o foo main.o -L. -Wl,-rpath,. -lfoo
[ p.344 표 1행 1열 ]
값 숫자 → 값 번호
[ p.344 두 번째 코드 1행 ]
penguin> readelf -S foo
→ penguin> readelf -S libfoo.so
[ p.344 두 번째 문단 ]
주소 4에서 8까지는 0x796에서 0x7d6까지 아우르며,
→ 4번째 주소에 있는 값에서 8번째 주소에 있는 값은 0x796에서 0x7d6까지 아우르며,
[ p.353 본문 1-2행 ]
PLT는 실행파일이지만 아주 특수한 실행 파일로 PLT에서 각 함수마다 하나씩 존재한다.
→ PLT는 아주 특수한 실행 가능 영역이다(PLT에는 각 함수마다 항목이 하나씩 존재한다).
[ p.353 본문 2행 ]
objdump를 사용해서 PLT를 역어셈블했지만,
→ objdump를 사용해 PLT를 역어셈블해봐야,
[ p.353 아래에서 2행 ]
main.C 파일에서 함수 main은 sleep을 호출하여 잠들기에 들어간다.
→ main.C 파일에서 함수 main은 sleep을 호출한다.
[ p.354 두 번째 문단 ]
첫 번째 명령은 주소 0x8049924로 건너뛰는 jmp이다.
→ 첫 번째 명령은 주소 0x8049924에 저장된 내용을 주소로 해석하여 해당 주소로 건너뛰는 jmp이다.
[ p.359 5-7행 ]
스택에서 몇몇 함수는 정적이며 프로그램의 주소 영역은 스택 함수 주소를 함수 이름으로 사상하기 위해 사용하는 심볼 테이블을 포함하지 않을지도 모른다.
→ 스택에 있는 함수 중 몇몇은 정적 함수(static function)일 수 있으며, 프로그램의 주소 영역은 스택 함수의 주소를 함수 이름으로 사상하기 위해 사용하는 심볼테이블을 포함하지 않는다.
[ p.360 그림 9.4 ]
데이터 섹션 → 데이터 세그먼트
[ p.361 4행 ]
함수는 우선 PLT로 가서 → 함수 참조는 우선 PLT로 가서
[ p.362 아래에서 7-8행 ]
static myClass myObj ;
myClass myObj2 ;
→ int glob_int = 5;
static int static_int =5;
[ p.367 9.7.3 재배치와 링킹 절 1-2행 ]
링킹은 유형과 이름이 동일하며 정의된 심볼로 정의되지 않은 심볼을 일치시켜 묶는 과정이다.
→ 링킹은 정의되지 않은 심볼을 유형과 이름이 동일한 정의된 심볼로 매칭, 바인딩시키는 과정이다.
[ p.368 참고 아래 실행예 2행 ]
penguin> readelf -r pic.o
→ penguin> readelf -r pic
[ p.372 '프로그램 해석기' 절 아래 문단 역자주 추가 ]
export LD_SHOW_AUXV=true로 보조벡터를 볼 수 있도록 설정하고 있다. 보조 벡터 정보를 더 이상 안보고자 한다면 unset LD_SHOW_AUXV명령으로 환경변수 LD_SHOW_AUXV를 해제한다.
[ p.384 intercept.C 코드 앞에 한 행 추가 ]
intercept.C:
→ int printf(const char *format, ...);
intercept.C:
[ p.440 그림 ]
[ p.viii 끝에서 두 번째 문단 4행 ]
(주의: 달리 원서 예제는 → (주의: 원서 예제는 번역서와는 달리
[ p.xxi 참고 2행 마침표 삭제 ]
http://www.phptr.com/title/013147751X. → http://www.phptr.com/title/013147751X
[ p.93 세 번째 문단 2-3행 ]
/bin/bash에, 주소 공간 0x08048000-01080b6000으로 사상되어
→ /bin/bash 실행파일이 주소 공간 0x08048000-01080b6000으로 사상되어
[ p.177 팁 박스 2행 ]
경계는 2NUM으로 계산한다.
→ 경계는 2NUM으로 계산한다.
[ p.177 아래에서 네 번째 행 ]
네 번째 워드는 주소가 0xbffff228c, 값은
→ 네 번째 워드는 주소가 0xbffff22c, 값은
[ p.178 첫 번째 코드 4행 ]
mov %esp, %ebp → movl %esp, %ebp
[ p.178 페이지 첫 번째 코드 8행 ]
0x08048424 <function2+16>: lea 0xfffffffc(%ebp), %eax
→ 0x08048424 <function2+16>: leal 0xfffffffc(%ebp), %eax
[ p.179 두 번째 문단 ]
0xbffff234, 0xbffff238, 0xbffff23c, 0xbffff40에 저장된
→ 0xbffff234, 0xbffff238, 0xbffff23c, 0xbffff240에 저장된
[ p.179 두 번째 문단 2행 ]
스택 포인터를 옮기는 subl 명령 두 개를 보면
→ 스택 포인터를 옮기는 sub 명령 두 개를 보면
[ p.183 2행, 4행 ]
-export-dynamic → --export-dynamic
[ p.183 1-3행에 대한 역자주 추가 ]
(독자 김홍숙님께서 의견 주셨습니다.)
-rdynamic 스위치는 gcc의 specs파일에 저장된 내용에 따라 링커 옵션 --export-dynamic 으로 변경된다. 다음과 같은 명령을 통해 확인할수 있다.
gcc -dumpspecs | grep rdynamic
%{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker %(dynamic_linker)}} %{static:-static}}}
[ p.198 마지막 코드 아래에서 4행 ]
(gdb) unset envrionment FOOs → (gdb) unset envrionment FOO
[ p.201 아래에서 11행 ]
현재 설정을 전부 보려면 -u 인수를 사용한다.
→ 현재 설정을 전부 보려면 -a 인수를 사용한다.
[ p.203 마지막 행 ]
core-pattern에 대한 자세한 설명은
→ core_pattern에 대한 자세한 설명은
[ p.247 코드 네 번째 행 foo 함수의 return 직전 문장 ]
pEmp->manager_emp_no=10;
→ pEmp->is_ceo=1;
[ p.248 아래에서 3행 ]
0x08048372 <foo+6>: movl $0x10, 0x4 (%eax)
→ 0x08048372 <foo+6>: movl $0x1, 0x4 (%eax)
[ p.295 마지막 행 ]
cscope -d -P /usr/src/$dbpath -p 20 -f /usr/src/$dbpath/cscope.out fi
→ cscope -d -P /usr/src/$dbpath -p 20 -f /usr/src/$dbpath/cscope.out
fi
[ p.315 마지막 행 ]
g++ -o foo main.o -L. -Wl,-rpath, -lfoo
→ g++ -o foo main.o -L. -Wl,-rpath,. -lfoo
[ p.344 표 1행 1열 ]
값 숫자 → 값 번호
[ p.344 두 번째 코드 1행 ]
penguin> readelf -S foo
→ penguin> readelf -S libfoo.so
[ p.344 두 번째 문단 ]
주소 4에서 8까지는 0x796에서 0x7d6까지 아우르며,
→ 4번째 주소에 있는 값에서 8번째 주소에 있는 값은 0x796에서 0x7d6까지 아우르며,
[ p.353 본문 1-2행 ]
PLT는 실행파일이지만 아주 특수한 실행 파일로 PLT에서 각 함수마다 하나씩 존재한다.
→ PLT는 아주 특수한 실행 가능 영역이다(PLT에는 각 함수마다 항목이 하나씩 존재한다).
[ p.353 본문 2행 ]
objdump를 사용해서 PLT를 역어셈블했지만,
→ objdump를 사용해 PLT를 역어셈블해봐야,
[ p.353 아래에서 2행 ]
main.C 파일에서 함수 main은 sleep을 호출하여 잠들기에 들어간다.
→ main.C 파일에서 함수 main은 sleep을 호출한다.
[ p.354 두 번째 문단 ]
첫 번째 명령은 주소 0x8049924로 건너뛰는 jmp이다.
→ 첫 번째 명령은 주소 0x8049924에 저장된 내용을 주소로 해석하여 해당 주소로 건너뛰는 jmp이다.
[ p.359 5-7행 ]
스택에서 몇몇 함수는 정적이며 프로그램의 주소 영역은 스택 함수 주소를 함수 이름으로 사상하기 위해 사용하는 심볼 테이블을 포함하지 않을지도 모른다.
→ 스택에 있는 함수 중 몇몇은 정적 함수(static function)일 수 있으며, 프로그램의 주소 영역은 스택 함수의 주소를 함수 이름으로 사상하기 위해 사용하는 심볼테이블을 포함하지 않는다.
[ p.360 그림 9.4 ]
데이터 섹션 → 데이터 세그먼트
[ p.361 4행 ]
함수는 우선 PLT로 가서 → 함수 참조는 우선 PLT로 가서
[ p.362 아래에서 7-8행 ]
static myClass myObj ;
myClass myObj2 ;
→ int glob_int = 5;
static int static_int =5;
[ p.367 9.7.3 재배치와 링킹 절 1-2행 ]
링킹은 유형과 이름이 동일하며 정의된 심볼로 정의되지 않은 심볼을 일치시켜 묶는 과정이다.
→ 링킹은 정의되지 않은 심볼을 유형과 이름이 동일한 정의된 심볼로 매칭, 바인딩시키는 과정이다.
[ p.368 참고 아래 실행예 2행 ]
penguin> readelf -r pic.o
→ penguin> readelf -r pic
[ p.372 '프로그램 해석기' 절 아래 문단 역자주 추가 ]
export LD_SHOW_AUXV=true로 보조벡터를 볼 수 있도록 설정하고 있다. 보조 벡터 정보를 더 이상 안보고자 한다면 unset LD_SHOW_AUXV명령으로 환경변수 LD_SHOW_AUXV를 해제한다.
[ p.384 intercept.C 코드 앞에 한 행 추가 ]
intercept.C:
→ int printf(const char *format, ...);
intercept.C:
[ p.440 그림 ]