본문 바로가기

컴퓨터/디버깅

(32)
함수 포인터가 boolean 으로 출력된 경우 이번 에러는... 뭔가 논리적으로 원인을 찾아 가기 힘든 경우였는데, 이런 상황을 알고 있다면 후에 이런 상황을 맞딱뜨렸을 때 이와 같은 원인 역시 고려할 수 있을 것이다. 결론적으로 얘기하자면, std::cout 으로 함수 포인터를 출력할 경우 boolean 으로 형변환되어 1 이 출력된다. 만약 함수의 출력값이 엉뚱하게도 계속 1 로 나온다면 이와 같은 원인 때문일 수 있다. 문제는 다음과 같은 함수를 출력하는 상황에서 발생했다. 문제가 생겼던 부분은 아래 쪽 코드인 make_stat_page.cpp 에서 130 번째 줄이다. 확인차 131번 줄도 만든 것인데, 여하튼 저렇게 했기 때문에 get_current_time 함수의 원본인 위쪽 코드의 내용에도 불구하고 계속 1 만 출력이 되었다. 그것은 곧..
긴 오류 메세지 알아 보기 STL 을 사용하다 보면 특히나 오류 메세지가 매우 길어질 때가 자주 있다. 길어진 이유를 찬찬히 뜯어 보면 별 내용은 없고 대부분 STL 의 container 의 형 선언 때문인데, 보통 사용할 때는 기본값(default 값)으로 되어 있는 것을 사용하기 때문에 명시적으로 코드에 적어 주지 않는 것들이 오류 메세지에는 전부 나오기 때문에 길어지곤 한다. 이러한 것들을 무시하고 오류 메세지를 읽으면 좀 더 빨리 오류 메세지의 의미를 알 수 있다. 혹은, 오류 메세지의 제일 끝부터 읽으면 된다. 예를 들면 다음과 같다. [adnoctum@nomadism analysis_code]$ makeg++ -c check_data_set_consistency_with_gene_rank.cppcheck_data_set..
오랜 시행 후 프로그램이 멈추는 경우 - GDI 문제 다음과 같은 에러가 있다는 연락을 받았다. 1,2,3 trials을 한 번에 시행할 경우 중간에 멈추는 버그 발생 환경 : Visual Studio 2010 on Windows 7 Professional SP1, English, 64-bit. 각 trial 은 대략 50~60개의 이미지를 보여주고 환자의 입력을 받는 것인데, 각 이미지 사이에 무반응자극 이미지를 한 장씩 보여 주게 되어 있다. 이런 상황에서 위와 같은 에러가 발생했다는 것은 대략 GDI 에 관련한 문제임을 직감할 수 있다. 따라서 디버깅을 하기 위해 작업관리자에서 GDI Objects 의 개수를 보여 주는 컬럼을 켠 상태에서 프로그램을 실행시켰다. 역시나, 객체 수가 계속 올라 간다. 즉, 문제는, GDI 객체가 제대로 해제되지 않아서 ..
STL의 set 의 iterator 와 const_iterator에 따른 오류 다음과 같은 오류가 났다. cluster_gene_by_robust_region.cpp:99: error: passing ‘const CRobust_Position’ as ‘this’ argument of ‘void CRobust_Position::inc_gene_count(const int&)’ discards qualifiers환경: GCC 4.4.6 on CentOS 6.3 (Kernel Linux 2.6.32-279.14.1.el6.x86_64) 그 쉽다는 컴파일 에러인데 쉽사리 이해가 되지 않는다. 에러 내용 자체는 const CRobust_Position 을 this 로 void CRobust_Position::inc_gene_count 함수로 넘기면 qualifier 를 버리게 되기 때문에 ..
less 를 찾을 수 없어서 에러가 난 경우 에러 메세지는 다음과 같다. c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: 'bool std::operator
a required resource was unavailable DC를 제대로 해제하지 않을 경우, 프로그램이 지속적으로 느려지다가 결국은 멈추거나 a required resource was unavailable 이라는 오류 메세지가 나타난다. 그리고 이 경우 GDI object 가 사용된 것이기 때문에 다음과 같이 화면의 갱신이 제대로 일어나지 않게 된다. 환경 : Visual C++ 10.0 (VS2010) on Windows 7 Professional SP1, 64 bit 위 그림에서 검게 표시된 부분이 WM_PAINT message 를 받아서 다시 그려져야 하지만 아직 그려지지 못한 부분들이다. 심지어 capture program으로 capture조차 제대로 되지 않는다. 오류 메세지 또한 정확히 나타나지 않고, 다음과 같이 나타난다. 우선, 이러한 경우는 일..
cannot convert ... 아주 전형적인 오류 메세지이다. 실제 에러는 다음과 같다. qtest.cpp: In function ‘int main(int, const char**)’: qtest.cpp:23: error: cannot convert ‘std::map**’ to ‘std::map*’ for argument ‘2’ to ‘bool get_qvalue_with_pvalue(std::vector, std::map*, std::map*, double*)’ STL 을 사용했기 때문에 에러 메세지가 아주 복잡한데, 실제 의미는 다음과 같이 구분하여 알아 볼 수 있다. qtest.cpp: In function ‘int main(int, const char**)’: qtest.cpp:23: error: cannot convert ‘..
discards qualifiers 에러 : STL의 map의 [] 연산자의 반환값 STL의 map 의 [] 연산자는 반환값이 value 값으로 넣어 준 type T에 대한 참조형이다. 만약 key 로 입력한 값에 해당하는 value 가 없을 때는 value 값의 type T에 대한 default 생성자가 호출된 값을 입력하고, 그 값에 대한 참조를 반환하게 된다. 따라서 만약 key 가 없었다면 반드시 map 의 크기가 1 이 증가하게 된다. 다음과 같은 에러가 났다. 작업 환경: GCC 4.1.2 20080704 (Red Hat 4.1.2-46) on CentOS 5.4 [adnoctum@bioism bc_tf_genesets]$ g++ ~/LJSLibrary/library/util.o remove_zero_gene_reorder_gsm.cpp -o remove_zero_gene_r..