本篇將 yocto 的實驗過程做一紀錄,主要內容參考此篇文章 ypdd-2016.10-ELCE-Berlin.pdf
2017年12月24日 星期日
2017年7月9日 星期日
mp3 檔案移除封面資訊
現在網路上取得的 mp3 檔案,大多已經幫忙作了封面圖片。
但是在比較舊的車用多媒體機器上(例如:舊款的 skoda),其實是無法辨識此資訊的。因此需要先將此資訊移除才能在車機上播放。
以下提供一個 script,可以批次移除所有 mp3 檔案的封面圖片。
但是在比較舊的車用多媒體機器上(例如:舊款的 skoda),其實是無法辨識此資訊的。因此需要先將此資訊移除才能在車機上播放。
以下提供一個 script,可以批次移除所有 mp3 檔案的封面圖片。
#!/bin/bash for i in *.mp3 do
ffmpeg -i "$i" -vn -codec:a copy -map_metadata -1 "../${i%mp3}mp3" done
2017年5月14日 星期日
mtrace 與 libmemleak
本篇參考 https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Leaks,
測試文中兩個偵測 memory leakage 的方法,分別是 mtrace 與 libmemleak,並且紀錄測試過程。
1. 使用 mtrace
2. 使用 libmemleak.so
3. 編譯 ARM 平台上面的 libmemleak.so
Reference:
測試文中兩個偵測 memory leakage 的方法,分別是 mtrace 與 libmemleak,並且紀錄測試過程。
1. 使用 mtrace
a. 針對單一程式:
a1. 在程式碼中 #include,並且在需要檢視 leakage 的區間分別加入 mtrace(),muntrace(),程式碼範例可參考此連結。
a2. 編譯以及偵測方法
$ gcc -g dleaker.c -o dleaker
$ MALLOC_TRACE=test1/mtrace.plain.log ./dleaker
$ mtrace ./dleaker test1/mtrace.plain.log > test1/mtrace.plain.leaks.log
a3. 原理簡介
mtrace() 執行之後,會將後續所有 malloc 相關函數全部置換。並且記錄 malloc/free 使用過程。每次配置記憶體使用 "+" 紀錄,釋放記憶體使用 "-" 紀錄,最後統計沒有被釋放的記憶體,就是 memory leakage
如下:
$ cat mtrace.plain.log
= Start
@ ./dleaker:[0x80484cb] + 0x9dde378 0xa
@ ./dleaker:[0x80484db] + 0x9dde388 0x14
@ ./dleaker:[0x80484ec] - 0x9dde378
= End
$ cat mtrace.plain.leaks.log
Memory not freed:
-----------------
Address Size Caller
0x09dde388 0x14 at /home/albert/test/libtrace/dleaker.c:13
a4. 注意:編譯時要加入 "-g" ,這樣 mtrace 才能夠顯示出正確的檔案名稱與行號。
b. 有時候僅知道行號,還是無法確認問題,最好是有上 backtrace,提供更清楚的呼叫流程,實驗過程如下:
b1. 替換原本的 malloc,在記憶體配置之後,打印 backtrace。
extern void *__libc_malloc(size_t size);
extern void *malloc(size_t size)
{
void *ptr = __libc_malloc(size);
fprintf(stderr,"%s\n", __func__);
_ShowBacktrace();
return ptr;
}
b2. 一開始使用下列方法實作 _ShowBacktrace()
#include
static void _ShowBacktrace(void)
{
void *bt[1024];
int bt_size;
char **bt_syms;
int i;
bt_size = backtrace(bt, 1024);
bt_syms = backtrace_symbols(bt, bt_size);
for (i = 1; i < bt_size; i++)
{
printf("%s", bt_syms[i]);
}
free(bt_syms);
}
結果程式會掛掉,因為 backtrace() 會再一次呼叫 malloc,因此此項修改會不斷的呼叫 malloc,最後導致 stack overflow。所以需要加上 flag 避免此無限迴圈。相關討論可參考 https://patchwork.ozlabs.org/patch/442890/。
若對 mtrace 內部實作有興趣,可以直接參考此檔案 http://code.metager.de/source/xref/gnu/glibc/malloc/mtrace.c
2. 使用 libmemleak.so
a. 首先自行編譯 libmemleak.so (實驗時使用 ubuntu 16.04)
$ sudo apt-get update
$ sudo apt-get install binutils-dev libiberty-dev libreadline-dev doxygen
$ wget https://github.com/CarloWood/libmemleak/releases/download/v0.1.1/libmemleak-0.1.1.tar.gz
$ tar zxvf libmemleak-0.1.1.tar.gz
$ cd libmemleak-0.1.1
$ ./configure
$ make
$ sudo make install
b. 編譯測試範例
$ git clone https://github.com/alb423/memory_leakage.git
$ cd memory_leakage
$ make
c. 執行測試程式,動態偵測記憶體資訊
$ export LIBMEMLEAK_SOCKNAME=./memleak_sock
$ cd ~/libmemleak-0.1.1
$ LD_PRELOAD='/usr/local/lib/libmemleak.so' ./hello
$ memleak_control
d. 若要讓程式一開始就偵測記憶體,需加入 MEMLEAK_CONFIG 定義
$ export MEMLEAK_CONFIG=mtraceinit
$ cd ~/memory_leakage
$ LD_PRELOAD='/usr/local/lib/libmemleak.so' ./dleaker3
$ memleak_control
e.執行結果畫面截圖如下:
3. 編譯 ARM 平台上面的 libmemleak.so
先安裝 arm tool chain
$ sudp apt-get update
$ sudp apt-get upgrade
$ sudo apt-get install gcc-arm-linux-gnueabihf
編譯 libcurses.a
$ wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
$ tar -pxzf ncurses-5.9.tar.gz
$ ./configure --host=arm-linux-gnueabihf --without-debug --without-ada --without-shared --enable-widec CPPFLAGS="-P"
$ sudo make install DESTDIR=$HOME/註:此處編譯 library 成功,但是編譯測試程式仍然有誤,上述步驟應該有需要改善。
編譯 libreadline.so
直接參考此篇即可,最後再安裝到相同目錄 (也許此處可以直接使用靜態編譯)
$ sudo make install DESTDIR=$HOME/
編譯 libmemleak
$ CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf LDFLAGS="-L$HOME/usr/local/lib -L$HOME/usr/lib -lreadline -lncursesw"
$ make
$ sudo make install DESTDIR=$HOME/
Reference:
- https://how-to-build-for-arm.wikispaces.com/readline
- http://www.plunk.org/~hatch/goodies/backtracefilt.C
- https://github.com/CarloWood/libmemleak
- http://stackoverflow.com/questions/34732/how-do-i-list-the-symbols-in-a-so-file
- https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Leaks
2017年4月1日 星期六
TDD(Test Driven Development)
www.throwtheswitch.org 設計了一套用來作單元測試的工具。對於使用 TDD(Test Driven Development)開發流程的人員,挺方便的,其中共包含四套工具,分別是 Unity,CMock,CExpection,Ceedling。
摘錄官方說明如下:
摘錄官方說明如下:
- Unity - Curiously Powerful Unit Testing in C for C.
- CMock - Automagical generation of stubs and mocks for Unity Tests.
- CException - Lightweight exception handling for C.
- Ceedling - Test build management.
2017年2月27日 星期一
偵測 Race Condition 的方法
在並行運算領域,哲學家就餐問題(英語:Dining philosophers problem)是一個經典問題,此問題可能會導致死結(deadlock)或飢餓(starvation)。
常見的解決方式有服務生解法,資源分級解法,Chandy/Misra解法。細節可參考 wiki 的 哲學家就餐問題。
解決此問題的基本概念,便是讓共享的資源在不同執行緒內可以受到控制,但有時因為設計不良,便會出現競爭危害(race hazard)。又稱為競爭條件(race condition)
本篇將針對 race condition 的偵測及解決方式作一介紹。
常見的解決方式有服務生解法,資源分級解法,Chandy/Misra解法。細節可參考 wiki 的 哲學家就餐問題。
解決此問題的基本概念,便是讓共享的資源在不同執行緒內可以受到控制,但有時因為設計不良,便會出現競爭危害(race hazard)。又稱為競爭條件(race condition)
本篇將針對 race condition 的偵測及解決方式作一介紹。
2017年2月25日 星期六
Cross compile valgrind for ARM-Linux
紀錄一下編譯 valgrind 的過程,也許有天會用得到。
1. Download valgrind
2. 編譯程式
3. 確認檔案編譯正確,並用 qemu-arm 檢查檔案是否可以正確執行
1. Download valgrind
使用的版本是 valgrind 3.12.0 -- 20 October 2016.
可從此處下載 http://www.valgrind.org/downloads/valgrind-3.12.0.tar.bz2
2. 編譯程式
$ wget http://www.valgrind.org/downloads/valgrind-3.12.0.tar.bz2
$ tar jxvf ./valgrind-3.12.0.tar.bz2
$ cd valgrind-3.12.0/
先修改目錄下的 configure, 尋找 armv7, 取代成 arm
$ CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=$HOME/test/valgrind CFLAGS=-static
$ make
$ make install
3. 確認檔案編譯正確,並用 qemu-arm 檢查檔案是否可以正確執行
$ file valgrind4. 若安裝路徑有問題,可以使用下列方式安裝
valgrind: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
./configure --prefix=/target/board/pathReference:
make install DESTDIR=/local/path
- http://www.valgrind.org/
- https://github.com/svn2github/valgrind/blob/master/README
- http://ottoshare.blogspot.tw/2012/03/valgrind.html
- http://stackoverflow.com/questions/16920581/valgrind-in-arm-cortex-a8-issue-configure-error-unsupported-host-architecture
- http://stackoverflow.com/questions/11307465/destdir-and-prefix-of-make
2017年2月9日 星期四
RTSP SDP 的 profile-level-id
晚上看到對岸同胞的部落格,將重點整理如下,作一記錄。
在 RTSP Describe 所回覆的 SDP 內容中,會出現下列的描述,此處 packetization-mode 與 profile-level-id 各是什麼意思呢
在 RTSP Describe 所回覆的 SDP 內容中,會出現下列的描述,此處 packetization-mode 與 profile-level-id 各是什麼意思呢
a=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=Z00AKZpigPAET8uAtQEBAUAAAPoAADqYOhgA9CAAA7msrvLjQwAehAAAdzWV3lwo,aO48gA==
訂閱:
文章 (Atom)
