Eclipse/GDB를 사용하여 Linux Real-Time 타겟에서 공유 라이브러리 디버깅

업데이트 됨 Jun 1, 2023

환경

소프트웨어

  • LabVIEW Professional
  • LabVIEW Full

운영 체제

  • LabVIEW Real-Time (NI Linux Real-Time)

프로그래밍 언어

  • C
  • C++

다른

소프트웨어 툴: Eclipse IDE, GDB 디버거

NI Linux Real-Time(LinuxRT), Eclipse Edition 용 C&C++ 개발 도구를 사용하여 공유 라이브러리를 만들었습니다. Eclipse/GDB를 사용하여 LinuxRT 타겟에서 공유 라이브러리를 어떻게 디버깅합니까?

공유 라이브러리를 디버깅하는데 사용할 수 있는 두 가지 방법이 있습니다. 두 방법 모두 Getting Started with C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition 문서에 설명된 방법을 사용하여 배포할 공유 라이브러리를 구축했다고 가정합니다. 이 문서는 NI Linux Real-Time (LinuxRT), Eclipse Edition 용 C&C++ 개발 도구 설치 시 패키지로 함께 제공됩니다.

또한 기존 코드를 NI Linux Real-Time(LinuxRT), Eclipse Edition 용 C&C++ 개발 도구로 가져올 수 있으며 타겟에서 실행중인 Linux Real-Time 운영 체제와의 호환성을 위해 지정된 교차 컴파일러 경로와 특정 접두어 arm-none-linux-gnueabi- 를 사용하여 빌드할 수 있습니다.


Eclipse에서 GDB를 올바르게 작동하게 하려면 /usr 및 /usrlib을 대상 루트 파일 시스템에서 로컬 호스트의 디렉토리인 <RootFileSystemDir>로 복사해야합니다. 시작하기 전에 프로젝트에 배포가능한 디버깅 구성이 있는지 확인하십시오.

다음 디버깅 방법을 수행하기 전에 공유라이브러리 .so 파일을 타겟에 전송하려면 다음 단계를 완료하십시오.
  1. 파일 메뉴 바에서 창(Window)»Open Perspective»기타(Other)»원격 시스템 탐색기(Remote System Explorer)을 클릭하십시오.
  2. 확인(OK)을 클릭하십시오.
  3. 원격 시스템에 연결 정의(Define a connection to remote system) 단추를 클릭하여 새 연결 마법사(New Connection Wizard)를 여십시오. 

  4. General 폴더에서 SSH Only를 선택하십시오.
  5. 다음(Next)을 클릭하십시오.
  6. 상위 프로파일(Parent profile) 풀다운 메뉴에서 원격 시스템 연결을 포함할 프로파일을 선택하십시오.
  7. 호스트 이름(Host name) 텍스트 상자에 Linux Real-Time 타겟의 호스트 이름 또는 IP 주소를 입력하십시오.
  8. 마침(Finish)을 클릭하십시오.
  9. 원격 시스템 탐색기(Remote System Explorer) 창에서 workspace 디렉토리로 이동하여 해당 프로젝트의 디버그 폴더에서 .sofile을 찾으십시오.
  10. 타겟 아래의 Sftp 파일(Sftp Files)을 확장하여 .so 파일을 타겟의 /usr/lib 디렉토리로 복사하고 /usr/lib로 이동합니다.

    참고: 공유 라이브러리를 이 디렉토리에 둘 필요는 없습니다. 만약 다른 디렉토리에 놓게 되면 호출 라이브러리 노드에 공유 라이브러리의 전체 경로를 제공해야합니다.

Eclipse에서 GDB를 사용한 디버깅 방법 :
디버깅 기능을 실행하려면 .gbdinit 파일이 필요합니다. 이것은 코드에 브레이크포인트를 설정할 것입니다. .gbdinit 파일을 작성하려면 다음 단계를 완료하십시오.
  1. Windows 탐색기에서 프로젝트 경로로 이동하십시오.
  2. 창을 마우스 오른쪽 버튼으로 클릭합니다.
  3. 새로 만들기(New)»텍스트 문서(Text Document)»파일(File)»다른 이름으로 저장(Save As)을 선택하십시오.
  4. 다른 이름으로 저장 형식으로 모든 파일(All Files)을 선택하고 이름을 .gdbinit 로 지정하십시오.
  5. 저장(Save)을 선택하십시오. 
  6. 파일에서 별도의 라인에 다음을 입력하십시오.
    set breakpoint pending on
    set sysroot <RootFileSystemDir>
그런 다음 Getting Started with C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition 문서의 Debugging a C/C++ Project 섹션 지침을 수행하십시오. 이것은 공유 라이브러리를 디버깅할 수 있도록 설정합니다. 새 프로젝트는 C/C++ Remote Application in the Debug Configuration 메뉴 아래에 추가해야합니다. 추가적으로 공유 라이브러리를 디버깅하려면 다음 단계를 완료하십시오.
  1. 실행(Run)»디버그 구성(Debug Configurations)으로 이동합니다.
  2. 디버그 구성(Debug Configurations) 창에서 프로젝트가 메인(Main)탭에서 선택되어 있는지 확인하십시오.
  3. 동일한 탭에서 연결(Connection) 옵션으로 이동하여 타겟을 선택하십시오.
  4. 동일한 탭에서 Remote Absolute File Path for C/C++ Application을 타겟의 공유 라이브러리를 가리키도록 변경하십시오.
  5. 동일한 탭에서 적용 버튼 옆에 있는 다른 항목 선택(Select other)을 클릭하십시오.
  6. Select Preferred Launcher 창에서 Standard Remote Create Process Launcher가 만약 선택되지 않았다면 선택하십시오.
  7. 확인(OK)을 클릭하십시오.
  8. 디버거(Debugger) 탭으로 이동합니다.
  9. Gdbserver 설정(Settings)을 선택하십시오.
  10. xxxx 형식의 포트 번호를 기록해 두십시오. 일반적으로 기본값은 2345입니다.
  11. 사용하는 운영 체제의 명령프롬프트를 실행하십시오.
  12. gdbserver :xxxx ---attach 'pidof lvrt'명령을 실행하십시오. 여기서 xxxx는 포트 번호입니다.
  13. 디버그 구성(Debug Configurations) 창으로 돌아갑니다.
  14. 디버거(Debugger) 탭에서 메인(Main) 탭을 클릭하십시오.
  15. 찾아보기(Browse)를 선택하여 GDB 디버거 옵션을 찾습니다. 
  16. <National Instruments>\Eclipse\toolchain\gcc-4.4-arm\i386\bin\arm-none-linux-gnueabi-gdb.exe로 이동하십시오.
  17. 열기(Open)를 클릭하십시오.
  18. 찾아보기(Browse)를 선택하여 GDB 명령 파일을 찾습니다.
  19. 현재 프로젝트의 .gdbinit 파일로 이동하십시오.
  20. 열기(Open)를 클릭하십시오.
  21. 시작시 중지(Stop on startup)를 체크해제하십시오. 
  22. 적용(Apply)»디버그(Debug)를 선택하십시오.
이제 디버그 보기(Debug View)가 열리며 Eclipse의 맨 아래에 있는 콘솔(Console)탭에서 애플리케이션을 디버깅할 수 있습니다. 실행이 공유 라이브러리 소스 코드의 브레이크포인트에서 일시 중단되면 이 GDB Console 탭을 제어하게 됩니다.

디버깅을 중지하려면 콘솔을 제어해야 합니다. Suspend라고 표시된 일시중지 아이콘을 클릭하여 프로그램을 중지할 수 있습니다. 그런 다음 detach 명령을 입력하여 프로젝트의 연결을 끊습니다.

참고: 타겟에서 실행중인 VI에서 공유 라이브러리가 호출되고 실행이 브레이크포인트에 도달하면 타겟의 lvrt 프로세스가 일시중단됩니다. 이로 인해 호스트에서 타겟에 대한 연결이 끊어집니다. 디버거가 브레이크포인트를 벗어나면 대상에 대한 연결이 복구됩니다.

GDB 명령 프롬프트와 SSH 클라이언트를 이용한 디버깅 :
이 방법을 사용하려면 SSH 클라이언트가 필요합니다. GDB 명령 프롬프트 및 SSH 클라이언트를 사용하여 디버깅하려면 다음 단계를 완료하십시오.
  1. 로컬 호스트에서 명령 프롬프트를 엽니다.
  2. cd C:\Program Files\National Instruments\Eclipse\toolchain\gcc-4.4-arm\i386\bin\을 입력하여 GDB 디버거의 위치로 이동하십시오.
  3. arm-none-linux-gnueabi-gdb.exe를 입력하여 디버거를 실행하십시오.
  4. 다음 명령을 입력하십시오.

    set breakpoint pending on
    file C:/<path to the shared object>/ExampleLibrary.so
    set sysroot <RootFileSystemDir>

  5. 명령 프롬프트에 모든 브레이크포인트를 입력하십시오.
  6. cRIO에서 xxxx형식의 열려있는 TCP 포트를 찾으십시오. 여기서 xxxx는 타겟의 열린 포트 번호입니다. 기본값은 보통 2345입니다.
  7. SSH 클라이언트를 열고 다음을 입력하십시오.
    gdbserver :xxxx --attach 'pidof lvrt'
  8. 명령 프롬프트로 돌아가서 다음을 입력하십시오.
    target remote <Target Name>:xxxx.
디버깅 프로세스를 종료하려면 GDB가 continue 모드가 아닌지 확인하고 detach를 입력하십시오.