반응형

Gstreamer launcher valgrind debugging

Gstreamer Plugin을 개발하다보면 Gstreamer 내에서의 메모리 관리와 작성하고자 하는 코드의 메모리 관리가 일관되지 못해 의도치 않은 Memory leak을 유발하는 경우가 많다. 이럴 경우 어디에서 Memory의 관리를 놓쳤는지 찾아야 하는데 Gstreamer launcher로 테스트를 할 경우 valgrind를 물리는 순간 정상 동작이 안되는 경우가 많다.

Intall Debug Symbol

Gstreamer


sudo apt install gstreamer1.0-*dbg gstreamer1.0-tools

glib


sudo apt install libglib2.0-0-dbg

Symbol을 설치하기 어려울 경우 아래와 같이 실행


echo "deb [http://ddebs.ubuntu.com](http://ddebs.ubuntu.com/) $(lsb_release -cs) main restricted universe multiverse deb [http://ddebs.ubuntu.com](http://ddebs.ubuntu.com/) $(lsb_release -cs)-updates main restricted universe multiverse deb [http://ddebs.ubuntu.com](http://ddebs.ubuntu.com/) $(lsb_release -cs)-proposed main restricted universe multiverse" | \ sudo tee -a /etc/apt/sources.list.d/ddebs.list

sudo apt install ubuntu-dbgsym-keyring

sudo apt update

sudo apt install libglib2.0-bin-dbgsym libglib2.0-0-dbgsym libglib2.0-dev-bin-dbgsym

Code를 Debugging 옵션으로 빌드


# In the following line:# --prefix /usr --libdir /usr/lib/aarch64-linux-gnu#     This is required when building GStreamer plug-ins. Other applications may ignore this#     Note that aarch64-linux-gnu is for AARCH64, change accordingly# CFLAGS#     If using C# CXXFLAGS#     If using C++

./configure --prefix /usr --libdir /usr/lib/aarch64-linux-gnu CFLAGS="-g -O0" CXXFLAGS="-g -O0"
make
sudo make install

Suppressions 파일 준비

Suppression은 Valgrind에서 특정 Leak에 대해서 제외하기 위해 사용되는 파일.

gst suppressions 파일

https://gitlab.freedesktop.org/gstreamer/common/-/blob/master/gst.supp

glib suppressions 파일

https://github.com/GNOME/glib/blob/main/tools/glib.supp

Valgrind 실행


G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind \
--leak-check=full --leak-resolution=high --num-callers=20 --trace-children=yes \
--suppressions=path/to/gst.supp \
--suppressions=path/to/glib.supp \
gst-launch-1.0 videotestsrc num-buffers=10 ! fakesinkz

출처

https://developer.ridgerun.com/wiki/index.php/How_to_Analyze_GStreamer_with_Valgrind

반응형
반응형

MacVim

윈도우로 개발 환경을 오래 하다보니 Win+R notepad 이 명령이 일하다가 잠깐 잠깐 노트할 때마다 손에 익어 있는 명령이다. 근데 맥으로 오면서 이렇게 instant하게 사용할만한 노트 메모를 적절하게 느껴지는 앱을 만나기 어려웠는데, 사실 노트를 할 때에는 마우스의 개입이 거의 필요없다보니, 제일 적절한건 vim이다. vim은 C/C++ 개발하기에도 좋지만, 마우스의 개입 없이 텍스트 기반에서는 이리 저리 널뛰며 regex 몇가지로 상당히 간편하고 빠르고 편리하게 문서 수정 및 작성이 용이하여 제일 애정한다. vim은 상당히 오래된 툴로, 각 OS버전별로 무료로 사용이 가능하다.

Default

처음 Default 설정은 뭔가... 심플하면서도... 너무 글씨도 작고... 뭔가 마음에 안든다.

Default 설정 변경

기본적으로 Vim의 설정은 ${HOME}/.vimrc 에 설정을 할 수 있다.
Mac에서도 동일하다. 간편히 vi ~/.vimrc를 추가하면 된다.
기본적으로 사용하는 syntaxt, hightlight search, auto indent, font size, colorscheme, tabsize, line number 등등등을 추가했다.

if has("gui_running")
  set guifont=Menlo:h20
  syntax on
  set hlsearch
  colorscheme darkblue
  set bs=2
  set smartindent
  set tabstop=2
  set extandtab
  set shiftwidth=2
  set ai
  set ruler
  set nu
endif

 

반응형
반응형

governor

CPU Frequency policy에 해아여 parameter 설정

Governor 타입

. OnDemand : 사용량에 따라 CPU Frequency를 변경 // <-- Default 인 경우 있음
. OnDemandX : 배터리 친화적인 OnDemand로서 I/O 스케쥴러에 따라 성능 변경
. Conservative : 느린 OnDemand. 가급적 최저 Frequence
. Interactive : OnDemand처럼 CPU에 위치한 부하 주파수에 따라 변경지만 빠르게 반응함
. Performance : CPU를 Maximum frequence로 고정 설정
. Powersave : CPU를 Minimum frequence로 고정 설정 // <-- Default 인 경우 있음

현재 설정 확인

 $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 

현재 CPU의 설정 가능 리스트 확인

0번 cpu로 예를 들지만 다른 cpu#를 확인해도 된다.

 $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

Governor 변경 설정

예제는 정규표현식으로 모든 CPU에 대해서 설정함. CPU#를 고정하여 설정해도 됨

 $ sudo echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
반응형
반응형
반응형
반응형

Ubuntu GUI 영상 캡쳐 방법(22.04)

간단하게 PrintScreen 버튼으로 이미지/동영상 캡쳐 가능
동영상 캡쳐시 상단에 중지 버튼으로 중지시 까지 영상 캡쳐됨

mp4 변환

기본적으로 영상 캡쳐시 포멧은 webm 포멧임.
mp4로 ffmpeg를 이용해서 간단하게 converting 할 수 있음.

기본 변환 방법

 $ ffmpeg -i <INPUT FILE> -vcodec libx264 -acodec aac <OUTPUT FILE>

Scale 지정 converting 방법

 $ ffmpeg -i <INPUT FILE> -vf "scale=<WIDTH>:<HEIGHT>" -vcodec libx264 -acodec aac <OUTPUT FILE>

Scale 지정시 Width 고정(예.1280), Height 가변

 $ ffmpeg -i <INPUT FILE> -vf "scale=1280:trunc(720/2)*2" -vcodec libx264 -acodec aac <OUTPUT FILE>

FPS 지정

영상 캡쳐를 하면 원본 영상 화질과 상관없이 무겁다. FPS를 지정하고 싶을 경우

 $ ffmpeg -i <INPUT FILE> -vf "scale=1280:trunc(720/2)*2" -vcodec libx264 -acodec aac -r <FPS NUM> <OUTPUT FILE>
반응형
반응형

맥 키 맵핑

맥에서 커스텀 키보드를 사용하려고 할 때도 있고,
일반 윈도우 레이아웃의 키보드를 사용해야 될 수도 있고,
맥의 공식 키보드를 사용하더라도 한영키의 딜레이를 막기 위해서도 키 맵핑은 필요하다

Karabiner

맥 키보드 레이아웃 맵핑 프로그램으로 사용하기 유용하다.

https://karabiner-elements.pqrs.org/

구성

Karabiner elements 와 Karabiner event viewer 두개가 있다.

Karabiner event viewer

맵핑하고자 하는 키를 확인할 수 있다. 이게 유용한게, Custom keyboard는 거의 윈도우를 중점으로 만들어져 있는지, 맥의 fn키를 설정할 수 없거나 확인할 수 없는 경우가 있다(Via와 같은 경우 fn키를 확인할 방법도 적용할 방법도 없었다)

Karabiner elements

필자와 같은 경우 Via는 키보드의 Firmware에 설정이 가능하니 컴퓨터나 OS의 Dependency가 없으니, 맥과 개인적인 layout을 설정하고, 사용할 수 없는 fn키만 Karabiner로 설정을 했다.

장점

상세하게 설정이 가능하다.
키보드 별로 설정을 해서 다른 레이아웃의 키보드에 영향이 없게끔 할 수 도 있다.
Special key도 설정할 수 있어서, 맥을 사용하는 사람들이 흔히 쓰는 F13키로 한/영키로 변경해서 사용하고 있는데, 딜레이도 없고 정말 편리하다.
전역 설정도 가능하다(근데 전역 설정을 할 경우 모든 키보드에 영향을 받기 때문에 맥의 기본 키보드에서는 정상적으로 쓸 수 없어서 잘 쓰지 않는다).

단점

이건 설치된 프로그램에서 Hooking해서 다른 키로 SW를 통해 인식하게 하는 것이기 때문에 다른 컴퓨터를 연결하거나 OS를 바꾸거나, Account를 바꾸게 되면 자신이 사용하고자 하는 환경에 Karabiner 를 설치하고, 해당 키보드에 설정을 다시 해야 할 필요가 있다.
필자와 같은 경우 재택 업무용 계정, 홈 계정, Window OS도 설치가 되어 있는데 모두 재 설치/설정을 해야 하는 부분은 불편하고, 만약에 컴퓨터를 바꾸게 될 경우 키보드에 대한 설정들을 다시 다 해줘야 하는 부분은 불편하다.

반응형
반응형

Docker container 내에서 GUi를 사용하기

Host의 XServer를 컨테이너와 공유해서 Container 내에서 GUI를 사용하는 방법.
X11 Forwarding을 사용하거나, Display를 통해서 사용 가능
다만 Forwarding을 하거나 Display에 대한 DISPLAY 환경 변수를 미리 정의를 하고 생성해야됨.

Host에서 Docker와 xserver 통신 설정

$ xhost +local:docker

Docker run parameter

 --volume /tmp/.X11-unix:/tmp/.X11-unix:ro -e DISPLAY=unix$DISPLAY

혹시 안될 경우

 --volume /tmp/.X11-unix:/tmp/.X11-unix:ro -e DISPLAY=$DISPLAY

혹시 안될 경우

 --volume /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY
반응형
반응형

Plugin 개발 할 때에 Memory Leak에 대해서 확인해보기 위해서 valgrind를 붙여보았는데, valgrind를 붙이면 launcher가 정상 동작 하지 않는다. 원인을 찾을 수 없어서 GStreamer에서 Memory leak에 대한 수단을 제공하지 않을까 해서 찾아보니 아래와 같이 Debugging을 할 수 있는 방법이 있다.

GST_DEBUG="GST_TRACER:7" GST_TRACERS="leaks" 

위와 같이 환경변수를 설정하고 동작시에 아래와 같이 종료 이후로 남아있는 메모리에 대해서 추적해준다.

0:00:33.676884568  6771 0x556451e88840 TRACE             GST_TRACER :0:: object-alive, type-name=(string)GstBuffer, address=(gpointer)0x7f835dc012c0, description=(string)buffer: 0x7f835dc012c0, pts 0:00:45.833522174, dts 99:99:99.999999999, dur 0:00:00.100000000, size 2764800, offset 458, offset_end 459, flags 0x0, ref-count=(uint)1, trace=(string);
0:00:33.676887333  6771 0x556451e88840 TRACE             GST_TRACER :0:: object-alive, type-name=(string)GstBuffer, address=(gpointer)0x7f834738a700, description=(string)buffer: 0x7f834738a700, pts 99:99:99.999999999, dts 99:99:99.999999999, dur 99:99:99.999999999, size 2764800, offset none, offset_end none, flags 0x0, ref-count=(uint)1, trace=(string);
0:00:33.676890357  6771 0x556451e88840 TRACE             GST_TRACER :0:: object-alive, type-name=(string)GstBuffer, address=(gpointer)0x7f86d44efe20, description=(string)buffer: 0x7f86d44efe20, pts 0:00:53.533522174, dts 99:99:99.999999999, dur 0:00:00.100000000, size 2764800, offset 535, offset_end 536, flags 0x0, ref-count=(uint)1, trace=(string);

Typename과 Address, ref-count 등을 남겨준다.
다만 이 메모리가 어떤것인지 자세히 나오지 않아서 이 방법에 대해서도 검토가 필요할 것 같다.

반응형
반응형
  1. CMakeLists.txt에 아래와 같이 FLAG를 추가해준다.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=address")
  1. 실행시 환경 변수값을 포함하여 실행해준다.

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 {EXECUTABLE BINARY}
  2. expor를 하는 방법도 있다.
    하지만 추천하지 않는다. 커맨드도 sanitizer에 물려서 제대로 실행이 안된다;

    $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5
반응형
반응형

EOG

원격 서버에서 개발/테스트를 진행할때에 Dump Image를 보기 위해서는 모니터를 연결하거나 파일을 압축해서 가져와서 봐야 하는 귀찮음이 있는데, 이미지 뷰어를 사용하면 X.11 환경에서는 커맨드로 이용하기도 좋고 귀찮음이 덜하다.

EOG라는 프로그램이 있어서 찾아보니 대충 사용하기 용이하다.

EOG Homepage

https://manpages.ubuntu.com/manpages/trusty/man1/eog.1.html

How to install

$ sudo apt install eog

How to run

$ eog ${PATH or FILENAME}
반응형

+ Recent posts