'2015/12'에 해당되는 글 4건

  1. 2015.12.14 #20151214-02 :: C++ :: gcc에서 runtime crash의 stacktrace를 보려면?
  2. 2015.12.14 #20151214-01 :: C++ :: "libc++abi.dylib: Pure virtual function called!"
  3. 2015.12.01 #20151201-02 :: C++ :: mongoose web server에서 mg_enable_multithreading 사용
  4. 2015.12.01 #20151201-01 :: C++ :: build cppcsp2-2.0.6 on Mac OS X

#20151214-02 :: C++ :: gcc에서 runtime crash의 stacktrace를 보려면?

아래 링크를 참고합니다.


http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes

#20151214-01 :: C++ :: "libc++abi.dylib: Pure virtual function called!"

gtest로 모듈을 작성하던 중 "libc++abi.dylib: Pure virtual function called!"라는 런타임 에러를 만났다.

콜스택 추척도 안되고 난감했었는데, 구글링을 해보니 생성자와 소멸자에서는 순수 가상함수가 호출되면 안된다고 한다.


코드의 생성자와 소멸자들을 확인해 보니

이 런타임 에러는 상속이나 소유관계에 상관없이 매우 광범위한 케이스에서 작동하는 듯 하다.


내 경우에는 객체가 네트워크 커넥션 객체를 추상 인터페이스로 소유하고 있는데,

(네트워크라는 것이 TCP, UDP, IPC, BT, Zigbee, UART 등 다양하니까...)

네트워크 추상 인터페이스의 Close() 함수를 소멸자에서 호출하기 때문에 발생했었다.


헛웃음이 나올 뿐 ... 허허


어떤 쓰레드에서는 리눅스에서는 이상 없는데

Mac OS X에서만 위 에러가 발생한다는 글이 있어 확인해볼 문제라고 생각한다.

뭐, 덕분에 큰 단위의 리팩토링이 불가피할 듯 ㅋ

#20151201-02 :: C++ :: mongoose web server에서 mg_enable_multithreading 사용

mongoose web server에서 mg_enable_multithreading 함수를 사용하려고 하면

해당 함수에 대한 링크 에러를 만나게 된다.

이유는 MG_ENABLE_THREADS 플래그가 define 되어있지 않기 때문이다.

컴파일 옵션에 위 플래그를 추가해 준다.

ex) POSIX: -DMG_ENABLE_THREADS

#20151201-01 :: C++ :: build cppcsp2-2.0.6 on Mac OS X

Mac OS X 10.11.1 El Capitan

LLVM 7.0.0 (clang-700.1.76)


홈페이지 [다운로드]


cppcsp2-2.0.6을 Mac OS X에서 빌드하려면 수 많은 에러를 만나게 된다.

아래와 같은 방법을 통해 문제를 해결한다.


소스파일을 다운로드 받고 압축을 푼다.

$ cd ~/Downloads

$ tar -vxzf cppcsp2-2.0.6.tar.gz


Makefile 생성을 위해 아래와 같이 스크립트를 실행한다.

$ ./configure


이 상태에서 make를 컴파일 실행하면 에러가 발생한다.


Makefile에 _XOPEN_SOURCE 선언을 추가한다.

$ vi Makefile


   DEFS = … -D_XOPEN_SOURCE


다시 make를 실행해 보지만 또 컴파일 에러가 발생한다.


src/process.h 파일을 수정한다.

$ vi src/process.h


   typedef ucontext Context;       (수정 전)

   typedef ucontext_t Context;    (수정 후)


다시 make 파일을 실행하면 컴파일 에러는 끝나지 않았다.


src/channel_factory.h 파일을 수정한다.

$ vi src/channel_factory.h


:210

deleteAll(o2o);                                                (수정 전)

StandardChannelFactory::deleteAll(o2o);    (수정 후)


이번에는 make를 실행하면 이번에는 링크 에러가 발생한다.


Makefile에서 -lrt 옵션을 제거한다.

$ vi Makefile


   CPPCSP_LINK_LIBS = -ltr -lpthread    (수정 전)

   CPPCSP_LINK_LIBS = -lpthread          (수정 후)


이제 make를 실행하면 성공한다.

make test를 실행하면 유닛테스트 결과를 볼 수 있다.