목록Effective (21)
센로그
대부분의 오류 원인은 서드파티 라이브러리 자체에 버그가 있어서가 아니라, 사용하는 방법에 문제가 있기 때문이다.다른 사람이 만든 서드파티 라이브러리의 코드를 다 알고 실행하는 건 아니기 때문이다. 따라서 이런 문제를 해결하려면 서드파티의 소스 코드를 직접 살펴보면 좋다.오류와 관련된 서드파티 모듈의 소스 코드를 직접 살펴보고 분석한다.사용하는 서드파티 코드가 오픈 소스라면 코드 검색 사이트를 활용하는 것도 좋다. 또는 서드 파티 코드를 디버깅 버전으로 다시 빌드한다.디버깅 버전으로 빌드한 라이브러리를 현재 작성중인 코드에 링크한 뒤, 직접 한단계씩 실행하면서 디버깅한다.제작사에 따라 서드파티 모듈에 대한 디버그용 정보와 기호를 함께 제공하기도 한다. 상용 소프트웨어를 구매할 때는 웬만하면 소스 코드도 같..
어떤 버그는 소프트웨어를 업데이트하는 것만으로 쉽게 해결할 수 있다.디버깅에 들어가기 앞서 환경을 최신 버전으로 업데이트 하는 것을 고려해본다.컴파일러나 라이브러리를 최신 버전으로 업데이트해서 다시 빌드해보면 예전에 소프트웨어를 패키지로 만드는 과정에서 볼 수 없던 버그가 드러나기도 한다.다만, 항상 최신 버전으로 업데이트 하는 것이 좋은 것은 아니다.많은 미들뒈어들은 여러 오류와 하위 호환성 문제를 달고 다니기 때문이다.업데이트에 너무 큰 기대는 하지 않는다.서드파티 모듈에서 버그가 발생할 수 있다는 점도 염두에 두어야 한다. 나의 생각 +) 눈치껏 업데이트 하라는 말 같다.실제로도 서드파티 라이브러리나 다양한 프레임워크의 경우 버전이 중요한 경우가 굉장히 많다.버전 간의 호환성 문제가 생기기도 한다...
디버깅에 필요한 모든 데이터를 한눈에 볼 수 있도록 모아두면 디버깅 작업에 도움이 된다.코드와 데이터의 상관관계나 패턴을 파악하기 쉽다.화면 전환과 같은 불필요한 작업 없이 몰입을 유지할 수 있다. 필요한 데이터들을 한눈에 보는 방법당연하게도, 최대한 넓은 화면을 사용한다.변경할 일이 거의 없는 데이터는 프린터로 출력해서 보는 것도 효과적이다.
복잡한 테스트 시나리오는 스크립트를 이용해 자동화하는 것이 좋다.스크립트 언어란, 코드를 작성하고 곧바로 실행할 수 있는 인터프리터 방식의 언어를 의미한다.Python, JavaScript 같은 언어가 있다.간단하고 직관적으로 테스트 코드를 작성할 수 있고, 테스트의 반복적인 실행 및 빠른 수정이 가능하다. 디버깅 하려는 소프트웨어에서 스크립트 언어를 지원하지 않는다면?해당 소프트웨어를 외부에서 스크립트 언어로 제어할 수 있도록 환경을 구성하면 된다.이는 스크립트 언어를 이용해 디버깅 소프트웨어의 함수와 API에 접근할 수 있는 인터페이스를 만들어, 그 소프트웨어를 제어하거나 테스트 자동화를 구현하라는 뜻이다. 나의 생각 +) 스크립트 언어 연동해서 테스트? 이렇게까지 할 가치가 있는 일인가?적합한 경우..
본격적인 디버깅 작업에 들어가기 전, 디버깅 과정을 반복하는 데 걸리는 시간을 최소화할 방안을 마련해야 한다빌드 시간을 줄이는 방법을 찾는다.수정한 부분에 관련된 파일만 컴파일하도록 파일 사이의 의존 관계를 잘 정리해야 한다.관련 도구makeAntMavenGradle소프트웨어를 배치하고 실행하는 과정을 효율적으로 만든다.서버를 다시 구동하거나, 캐시를 비우거나, 데이터베이스를 초기화 하거나, ... 프로젝트마다 과정이 다르다.해당 과정을 최대한 자동화하도록 한다.소프트웨어에서 오류가 나면 곧바로 실행을 멈추도록 한다.단위 테스트나 회귀 테스트 프레임워크를 지원한다면, 발생한 오류를 드러내는 테스트케이스를 작성한다. 나의 생각 +) Unity에서 맨날 오류나던 그거.. Gradle이 무엇인가?Gradle은..
복사 생성이나 복사 대입연산이 아예 수행되면 안되는 경우도 있다이럴 때는 실수로 사용하게 되어 컴파일러가 몰래 만들어내는 일이 없도록, 아예 사용을 금해버려야 한다.사용 안할 복사 생성자나 복사 대입연산자를 private 멤버로 선언하여, 외부에서 호출하지 못하도록 한다.이때, 선언만 하고 정의는 하지 않는다.정의를 해버리면 멤버 함수나 friend 함수에서 사용해버릴 수도 있기 때문이다.또는 delete 키워드를 사용하면 된다.불필요하거나 잘못된 사용을 방지하기 위해 특정 멤버 함수의 사용을 금지할 때 delete 키워드를 사용한다. +) 책에서 ios_base 클래스도 private 복사 생성자 구현되어 있다고 해서 찾아봤다.보다 최신 문법인 delete를 사용하고 있었다. (C++11 도입)