상세 컨텐츠

본문 제목

[한화비전 VEDA 4기] 14주차 리뷰

VEDA

by 전산거북이 2026. 6. 28. 16:44

본문

디버깅 툴

ftrace, uftrace, strace

ftrace는 저번주차에 이미 다룬 적 있는 커널 디버깅 툴입니다. 자세한 내용은 13주차 리뷰를 참고해주세요!

strace

strace 역시 디버깅 툴입니다. 무엇을 선택할 지는 본인의 자유일 듯 합니다. 다만, strace는 디버깅 정보가 없어도 어느정도 추적할 수 있습니다.

# 서버
strace -e trace=network ./tcpServer

# 클라이언트
strace -e trace=network ./tcpClient

이런 방식을 사용하면 다음과 같은 메시지를 볼 수 있습니다.

socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(24810), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 10)                           = 0
accept(3, ^Cstrace: Process 11255 detached
 <detached ...>

이렇게 때문에 만약 디버깅 정보가 존재하지 않는 상태에서 디버깅을 해야한다면, strace를 사용하는 것이 괜찮은 선택이 될 듯 합니다. 여기서는 bind()에서 htnos가 원하지 않는 값이 들어있습니다. 24810이라는 랜덤 값이 들어있기 때문에 이를 수정해주면 됩니다.

uftrace

이제 uftrace를 확인해볼까요?
uftrace는 오픈 소스 tracing 도구입니다. 무려 한국인이 만든 프로젝트라고 합니다.
https://github.com/namhyung/uftrace
ftrace는 커널용 디버깅 툴인데에 비해 uftrace는 유저모드에서 사용하는 디버깅 툴입니다. 다만, 컴파일 시 -pg 옵션을 넣어주어야 합니다. 프로파일링 옵션이라고 하네요.

$ gcc ex01.c -o ex01 -pg
$ uftrace ./ex01
# DURATION     TID      FUNCTION
   0.847 us [  39158] | __monstartup();
   0.228 us [  39158] | __cxa_atexit();
            [  39158] | main() {
  35.376 us [  39158] |   open();
  11.839 us [  39158] |   write();
 167.510 us [  39158] |   close();
 216.014 us [  39158] | } /* main */

$ uftrace record ./ex01

# record 값 확인하기
$ uftrace replay

# 만약, 함수와 인자를 확인하려면
$ uftrace record -a ./ex01

# 만약, 커널 함수를 확인하려면
$ sudo uftrace record -k ./ex01

uftrace 사용 예시입니다.

라즈베리파이에서

커널의 function을 디버깅하기 위해서는 System.map- 파일이 필요합니다만, 라즈베리파이에서는 해당 정보가 들어있지 않습니다. 이를 해결하기 위해서는 sudo apt install linux-images-$(uname -r)-dbg를 설치해주면 됩니다.

$ sudo uftrace record -F "*vfs*" -K 3 --with-sym=/usr/lib/debug/boot/System.map-6.12.75+rpt-rpi-v8 ./ex01

이후 설치된 파일의 위치를 잡아주면 uftrace가 정상적으로 작동하게 됩니다.

OpenCV

학부생 시절 배운적이 있는 OpenCV입니다. 오픈 소스 라이브러리로, 학술적/상업적 용도로 무료로 사용이 가능한 강력한 툴입니다. OpenCV는 영상처리, 특징분석 등을 할 수 있습니다.

설치

$ sudo apt update
$ sudo apt install libopencv-dev

openCV의 버전과 컴파일 시 필요한 라이브러리는 다음과 같이 확인할 수 있습니다.

$ pkg-config --modversion opencv4
4.10.0

$ pkg-config --cflags --libs opencv4
-I/usr/include/opencv4

$ pkg-config --libs opencv4
-lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_signal -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core

물론, 저걸 다 적어줄 수는 없습니다(너무 많으니까). 따라서 컴파일은 다음과 같이 하면 됩니다.

$ g++ src.c -o out $(pkg-config --cflags --libs opencv4)

그래도 쓰기 불편하다면, make/cmake 등을 이용하면 됩니다.
Cmake파일의 예시를 보여드리겠습니다.

cmake_minimum_required(VERSION 3.10)
project(RaspberryPi_OpenCV_CPP)

# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)

# Opencv 패키지 찾기
find_package(OpenCV REQUIRED)

# 헤더 경로 포함

이런식으로 적어주면 됩니다.

라즈베리파이에서 카메라 확인하기

반드시 카메라는 전원 선을 분리한 상태로 연결하여야 합니다. 안그러면 모듈이 고장날 수 있습니다.
...저도 알고싶지 않았습니다.

$ rpicam-hello  --list-cameras
Available cameras
-----------------
0 : imx219 [3280x2464 10-bit RGGB] (/base/soc/i2c0mux/i2c@1/imx219@10)
    Modes: 'SRGGB10_CSI2P' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
                             1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
                             1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
                             3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
           'SRGGB8' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
                      1640x1232 [83.70 fps - (0, 0)/3280x2464 crop]
                      1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
                      3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
$ rpicam-hello -t 0
# 시간제한 없이 카메라를 볼 수 있다.

아무튼 다음과 같이 나온다면 카메라는 성공입니다.
이제 제대로 활용하기 위해서는 GStreamer 라는 툴이 필요합니다.

패키지 설치

$ sudo apt install libglib2.0-dev libgstreamer1.0-0 libgstreamer1.0-dev

# 패키지 설치
$ sudo apt install gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav \ 
gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa libgstrtspserver-1.0-0

# 라즈베리파이 카메라용 플러그인/라이브러리 설치
$ sudo apt install libcamera-dev gstreamer1.0-libcamera

구성 요소

  • elements: 하나하나의 객체를 의미합니다. elements들은 파이프라인으로 연결됩니다.
  • pad: element의 입출력을 담당하는 구성 요소입니다.
  • bins: 컨테이너로, elements를 담아냅니다.
  • pipeline: 최상위 bin으로, 응용프로그램을 위한 버스를 제공합니다.사용법
  • # 특정 url의 영상 데이터 읽어오기 $ gst-launch-1.0 playbin uri=http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4

 

$ gst-launch-1.0 videotestsrc pattern=0 ! autovideosink

v4l2src 디바이스가 없어서 에러가 나오는 경우

$ gst-launch-1.0 v4l2src ! videoconvert ! autovideosink

 

$ gst-launch-1.0 audiotestsrc ! audioresample ! autoaudiosink

여기서 `!` 는 파이프라인입니다. shell 에서 `|` 라고 생각하면 됩니다.
#### 라즈베리파이 카메라 송출
```bash
# 라즈베리파이 서버
$ gst-launch-1.0 libcamerasrc ! video/x-raw,colorimetry=bt709,format=NV12,width=1280,height=720,framerate=30/1 ! queue ! jpegenc ! multipartmux ! tcpserversink host=0.0.0.0 port=5000

# 플레이를 할 클라이언트
$ gst-launch-1.0 tcpclientsrc host=100.120.80.50 port=5000 ! multipartdemux ! jpegdec ! autovideosink

openCV에서 카메라 사용

  6     std::string pipeline =
  7         "libcamerasrc ! "
  8         "video/x-raw,width=640,height=480,framerate=30/1 ! "
  9         "videoconvert ! "
 10         "video/x-raw,format=BGR ! "
 11         "appsink";
 12
 13     cv::VideoCapture cap(pipeline, cv::CAP_GSTREAMER); // webcam

관련글 더보기

댓글 영역