Debugging

김상건·2022년 11월 16일
0
  • 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 실행파일명 헥사코드

  • GDB 사용 방법
  1. 동작 중인 AirTomPV이나 HemoVista100과 BatteryApp 등을 kill하여 죽입니다.
  2. 실행 디렉토리에 있는 BatteryApp3.sh에 있는 환경 변수를 설정합니다.
    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
  3. Release 디렉토리에 있는 실행 파일을 수행 시켜 줍니다.
    $ 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

0개의 댓글