Segmentation fault(core dumped) 시, backtrace 확인 방법 (Stack 확인, 아래 -> 위)
main.cpp에 아래 내용 추가
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void __SIGNAL_handler(int sig) {
void *array[256];
size_t size;
// 스택에 있는 모든 void* entry를 가져옴
size = backtrace(array, 256);
// stderr에 모든 프레임을 출력
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
main() 함수에 추가
signal(SIGSEGV, __SIGNAL_handler);
전체 프로젝트 파일(AirTomPV.pro) 파일에 추가
CONFIG += debug
Qt 프로젝트 파일 전부(AirTomPV.pro , App.pro , Common.pro , QAlgorithmManager.pro)에 추가
QMAKE_CXXFLAGS += -g -rdynamic
실행 shell 파일(AirTomPV3.sh)에 추가
$BASE_DIR/AirTomPV >> stdlog.log 2>&1
위 추가 사항 적용 후 빌드
사용법
프로그램 실행 후,
Segmentation fault(core dumped) 발생하면
log파일에서 헥사코드 확인 후
addr2line -e 실행파일명 헥사코드
export LD_LIBRARY_PATH=/home/hemovista/BILAB_LIB/QtLib/lib/:/home/hemovista/BILAB_LIB/Intel/mkl_lib:/home/hemovista/BILAB_LIB/Intel/IntelCompiler_lib:/home/hemovista/BILAB_LIB/QtLib:$LD_LIBRARY_PATH
export QML_IMPORT_PATH=/home/hemovista/BILAB_LIB/QtLib/qml/:$QML_IMPORT_PATH
export QML2_IMPORT_PATH=/home/hemovista/BILAB_LIB/QtLib/qml/:$QML2_IMPORT_PATH
export QT_PLUGIN_PATH=/home/hemovista/BILAB_LIB/QtLib/plugins/:$QT_PLUGIN_PATH
export QTDIR=/home/hemovista/BILAB_LIB/QtLib
export QT_QPA_PLATFORM_PLUGIN_PATH=/home/hemovista/BILAB_LIB/QtLib/plugins/platforms:$QT_QPA_PLATFORM_PLUGIN_PATH
$ gdb HemoVista100
gdb> break <함수명>
gdb> bt /* 현재 수행하다 멈춘 thread의 back trace를 보여 줍니다. */
gdb> thread apply all bt /* 모든 thread의 back trace를 보여 줍니다 */
gdb> p <변수명> /* 보고 싶은 변수명을 입력합니다. */
gdb> run /* 프로그램 실행됨 */
<ctrl> + c /* 동작 중인 프로그램을 중단 시킵니다. */
그리고, QT creatort에서 Debug 모드에서 build 오류 발생하는 이유는 실행 시킬 때, shared library가 없어사 그러니, Debug 디렉토리에 다음과 같이 symbolic link를 생성하면 수행됩니다.
$ ln –sf libCommon.so libCommon.so.1
$ ln –sf libQAlgorithmManager.so libQAlgorithmManager.so.1