목록Effective/Effective Debugging (15)
센로그
성공적인 디버깅을 위한 마음가짐소프트웨어에서 발생한 문제는 항상 찾아서 고칠 수 있다고 믿는다.문제를 해결할 수 있다는 믿음이 없으면 흔들리거나 포기하기 쉽다.발생한 문제를 재현할 수 있다면, 반드시 해결할 수 있다. 재현하기 힘든 문제도 얼마든지 해결 방법을 찾을 수 있다.디버깅을 위한 충분한 시간을 확보한다.디버깅은 프로그래밍보다 훨씬 많은 노력이 필요한 작업이다.디버깅을 할 때는 고도로 집중해야 한다.방해 요인을 제거하고 다양한 가능성을 논리적으로 생각해본다.포기하지 않는다 ^_^ 어려운 문제를 만나면 잠을 자는 것도 좋다!더 이상 해결의 실마리가 보이지 않는 막다른 상황에서, 완전히 새로운 관점으로 디버깅 전략을 수정함으로써 돌파구를 찾을 수있다.잠은 이렇게 새로운 관점을 떠올리기 위해 필요하다!..
버그의 우선순위를 정하는 팁높은 우선순위데이터 손실 이슈고객과의 신뢰 문제이므로 중요하다.보안 이슈서비스 가용성을 저하시키는 이슈금전적인 문제로 직결되기 때문이다.안전과 관련된 이슈충돌 또는 멈춤 현상코드 위생 문제컴파일러 경고, 어서션 실패, 제대로 처리하지 않은 예외, 메모리 누수 등비교적 낮은 우선순위레거시 지원하위 버전 호환성 지원미적인 이슈우회 방법 문서화'다시 시도하세요' 같은 문구로 잠시 덮어두는 것거의 사용하지 않는 기능에서 발생하는 이슈 모든 문제를 해결할 필요는 없다.우선순위가 낮은 이슈를 해결하느라 우선순위가 높은 이슈를 해결하는 게 늦어지면 안된다.우선순위 낮은 이슈를 무시할 거라면, 이슈 추적 시스템에서 명확히 표시하도록 함'해결하지 않을 것임' 액션을 지정하고 이슈를 닫으라는 뜻..
소프트웨어를 다른 환경에서 컴파일 또는 실행해보면 문제를 찾을 수도 있다.프로세서 아키텍처아키텍처 별로 바이트 순서, 널 포인터 처리 방식 등 동작이 다르곤 함.현재는 Intel과 ARM 아키텍처로 좁혀졌음에도, 여전히 아키텍쳐로 인한 차이가 존재함ex) 메모리 레이아웃이나 잘못 정렬된 메모리 접근을 처리하는 방식이 다름아키텍처의 비트 수에 따라서도 동작이 달라짐.보통 N비트 아키텍처~ 이런 건 CPU가 한 번에 처리할 수 있는 데이터 크기와 메모리 주소 공간 크기를 의미함예를들어 long의 사이즈, char* 사이즈 같은 근본적인 값도 OS나 비트수에 따라 달라지곤 함. 다른 환경 사용하는법Virtual Machine 사용하기라즈베리 파이 사용하기클라우드 임대하기 컴파일러 또한 여러 컴파일러를 함께 사..
소프트웨어는 복잡한 만큼, 자체적으로 디버깅 기능을 제공하곤 한다.따라서 문제가 발생하면 해당 소프트웨어에서 자체적으로 디버깅 기능을 제공하는지 우선적으로 확인하고, 이를 활용하여 해결하면 된다.보통 프로그램에 대한 문서를 검색하거나, 소스 코드에서 debug 검색해보면 프로그램을 디버그모드로 실행하기 위한 설정을 알아낼 수 있음 예시예를들어 ssh 연결이 안되는 경우, -d 옵션을 사용해 디버깅 모드로 실행하면 연결이 안되는 이유를 출력해준다.SQL문의 성능이 너무 느린 경우, explain 구문을 사용하면 각 질의에 대한 세부 정보를 알려줌. 이를 통해 성능 개선 가능이런식으로 대부분의 소프트웨어는 디버깅을 위한 옵션을 제공하므로, 문제가 생긴다면 이 부분부터 우선적으로 확인해보도록 하자. 나의 생각..
차이점을 분석하면서 디버깅플랫폼을 옮긴다거나, 버전업을 하는 등의 상황에서는 기존 시스템과 새로운 시스템을 동시에 살펴봐야 하는 경우가 있다.이런 경우 두 시스템의 차이점을 분석함으로써 디버깅을 하면 효과가 좋다. 디버깅 하는 방법우선 로그 파일을 찬찬히 들여다보며 오류를 찾는다.그러나 로깅 메커니즘이 원하는 만큼 로그를 출력하지 않는다면, 트레이싱 도구로 런타임 동작을 분석할 수 있다.세부적인 부분에 특화된 도구들이 존재한다.운영체제 호출 과정 추적strace, truss, Procmon...dll 호출 과정 추적ltrace, Procmon...네트워크 패킷 추정tcpdump, WiresharkSQL db 호출 추적대조 방식으로 디버깅하기 위한 환경을 꾸미고, 명확한 부분(입력이나 명령줄 인수 등)부터..
문제의 원인을 찾는 방법문제 원인을 찾는 방법은 크게 두가지다문제가 발생한 지점에서부터 근본 원인을 추적하기애플리케이션이 시작하는 지점부터 문제의 원인이 나타날 때까지 찾는 것문제의 성격에 따라 어느 방법이 효과적인지가 달라진다. 문제 발생 시점부터 추적하기문제가 명확히 드러났다면 문제 발생 시점부터 상향식으로 찾으면 된다.다음 세 가지 문제 상황으로 나눌 수 있다. 프로그램이 갑자기 죽는 문제디버거로 프로그램을 실행하기프로그램 충돌 시점에 디버거 붙이기문제가 발생한 후 출력된 메모리 덤프 값 읽어보기메모리 덤프란, 프로그램 실행 중 메모리에 저장된 데이터와 상태를 그대로 저장한 스냅샷프로세스의 메모리 상태, 호출 스택, 레지스터 상태, 쓰레드 정보 등을 기록하고 있다프로그램이 그냥 멈춘 뒤 아무런 반응..