
ftrace는 저번주차에 이미 다룬 적 있는 커널 디버깅 툴입니다. 자세한 내용은 13주차 리뷰를 참고해주세요!
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는 오픈 소스 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는 영상처리, 특징분석 등을 할 수 있습니다.
$ 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
# 특정 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
$ 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
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| [한화비전 VEDA 4기] 15주차 리뷰 (0) | 2026.07.05 |
|---|---|
| [한화비전 VEDA 4기] 13주차 리뷰 (0) | 2026.06.22 |
| [한화비전 VEDA 4기] 12주차 리뷰 (0) | 2026.06.14 |
| [한화비전 VEDA 4기] 11주차 리뷰 (0) | 2026.06.07 |
| [한화비전 VEDA] 10주차 리뷰 (0) | 2026.05.31 |
댓글 영역