2020年3月7日 星期六

Message Sequence Chart

Message Sequence Chart (MSC) 可以用非常直觀的方式,來描述系統組件中的對應關係。
這邊紀錄與繪製 MSC 有關的網路資源 。

1. mscgen :
透過設計好的語法,mscgen 程式可自動繪製出MSC圖表,doxygen 產生的文件便是使用此工具繪製。 
例如:
輸入
msc{
  A, B;
  A -> B [label="request"];
  B -> A [label="response"];
}
便會繪製出下列 MSC 圖
語法介紹在此 http://www.mcternan.me.uk/mscgen/ 

2. 網頁版的 mscgen
可以直接在網頁上輸入語法,由 JavaScript 協助繪製 MSC 圖表。
https://mscgen.js.org  

3. Visual Studio Code
一個跨平台的應用程式,安裝 mscgen plugin 之後,就可以直接繪製 MSC 圖表。
Visual Studio Code - Code Editing. Redefinedcode.visualstudio.com 

此處僅整理可透過語法自動產生 MSC 的工具。
若需要比較漂亮的 MSC,可能還是得使用其他工具,手動拉圖繪製。

2020年1月29日 星期三

Autotools 用法舉例


1. 參考網路文章,整理操作步驟如下

  • 先建立程式碼,並在對應目錄內先寫好 Makefile.am
  • 執行 autoscan 生成 configure.scan, 複製成 configure.ac 並進行修改
  • 執行 aclocal 命令。掃描 configure.ac 檔案生成 aclocal.m4 檔案。
  • 執行 autoheader 命令。該命令生成 config.h.in 檔案。
  • touch NEWS README AUTHORS ChangeLog
NEWS README AUTHORS ChangeLog:
這些檔案是GNU軟體的標配,不過在專案中不一定需要加入。
如果專案中沒有這些檔案,每次autoreconf會提示缺少檔案,不過這並不影響。
  • 執行 automake -a -c -f 該命令生成 Makefile.in 檔案。
  • 執行 autoconf 命令。這個命令將 configure.ac 檔案中的巨集展開,生成 configure 指令碼。
  • 執行 ./congigure 命令。將Makefile.in命令生成Makefile檔案,開始編譯
$ ./configure --prefix=`pwd`/../test
$ make
$ make install
  • 若再次修改 configure.ac,則需要重複下列步驟
$ aclocal
$ autoheader
$ automake -a -c -f
$ autoconf


2. 實際測試步驟整理如下
a. 先安裝 autotool
$ sudo apt install autotools-dev m4 autoconf
$ sudo apt install autoconf-archive gnu-standards autoconf-doc libtool
b. 假設原始目錄架構如下
~/test/autotool_test$ tree
.
  ├── inc
  │   └── liba.h
  ├── src
  │   └── liba.c
  └── test
      └── test.c
c. 在對應目錄內先寫好 Makefile.am
Makefile.am
SUBDIRS = src test
src/Makefile.am
AM_CFLAGS = -I../inc
liba_LIBRARIES = liba.a
liba_a_SOURCES = liba.c liba.h
include_HEADERS = ../include/liba.h
test/Makefile.am
LDADD = ../libs/liba.a
AM_CFLAGS = -I../inc
bin_PROGRAMS = test
test_SOURCES = test.c 
d. 按照上述操作步驟生成 configure.ac, 修改後的檔案如下
AC_PREREQ([2.69])
AC_INIT(mytest, 1.0.0, alb423@gmail.com)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/liba.c])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_PROG_RANLIB
AC_CONFIG_FILES([Makefile
   src/Makefile
   test/Makefile])
AC_OUTPUT
e. 後續按照上述操作步驟執行即可。

參考資料

  • https://www.slideshare.net/zzz00072/gnu-make-autotools-cmake
  • https://slidesplayer.com/slide/15153334/
  • https://www.lrde.epita.fr/~adl/autotools.html



Makefile 中的 CFLAGS 變數套用順序

當使用 make 編譯程式時,若有多處定義 CFLAGS,則最終結果應該為何呢?

針對此疑問,整理相關資訊如下:

1. 若在命令列有先指定 CFLAGS, 則 Makefile 內的變數就不會套用。
例如: 執行 make CFLAGS=-g ,則 Makefile 內的 CFLAGS 便會失效 
原文如下:
If a variable has been set with a command argument (see Overriding Variables), then ordinary assignments in the makefile are ignored. If you want to set the variable in the makefile even though it was set with a command argument, you can use an override directive, which is a line that looks like this:
https://www.gnu.org/software/make/manual/html_node/Overriding.html


2.  若在命令列有先指定 CFLAGS, 但仍想要讓 Makefile 內的 CFLAGS有效,可使用 override 關鍵字
原文如下:
Variable assignments marked with the override flag have a higher priority than all other assignments, except another override. Subsequent assignments or appends to this variable which are not marked override will be ignored.
https://www.gnu.org/software/make/manual/html_node/Override-Directive.html#Override-Directive 
實際例子如下
https://github.com/buildroot/buildroot/blob/master/package/irrlicht/0001-override-CPPFLAGS-CXXFLAGS-and-CFLAGS-in-Makefile.patch

3. 若編譯時,命令列沒有帶入 CFLAGS,則直接參考 Makefile 內的 CFLAGS 設定即可。


2019年12月7日 星期六

Linux priority

Linux priority 基本概念可參考此篇介紹,摘錄如下:
In Linux system priorities are 0 to 139 in which 0 to 99 for real time and 100 to 139 for users. nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest. 
The relation between nice value and priority is :
PR = 20 + NI
so , the value of PR = 20 + (-20 to +19) is 0 to 39 that maps 100 to 139.

Linux schedule policy 分成兩大類,如下:

  • normal (只能修改 nice value 進行調整, 調整後的 priortiy 介於 100~139)
  • SCHED_OTHER
  • SCHED_BATCH
  • SCHED_IDLE
  • real-time (調整後的 priortiy 介於 0~99)
  • SCHED_FIFO
  • SCHED_RR
其優先權如下
SCHED_FIFO = SCHED_RR > SCHED_OTHER ~ SCHED_BATCH > SCHED_IDLE

我們可藉著設定 process schedule policy ,更改 process priority,舉例如下

1. 建立 thread 時,指定 priority
struct sched_param param;
param.sched_priority = 1;
s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (s != 0)
   handle_error_en(s, "pthread_attr_setinheritsched");
s = pthread_attr_setschedpolicy(&attr, SCHED_RR);
if (s != 0)
   handle_error_en(s, "pthread_attr_setschedpolicy");
param.sched_priority = sched_get_priority_min(SCHED_RR);
s = pthread_attr_setschedparam(&attr, &param);
if (s != 0)
   handle_error_en(s, "pthread_attr_setschedparam");
 
2. 當 thread 建立之後,動態改變 priority
struct sched_param param;
param.sched_priority = 1;
pthread_setschedparam(pthread_self(), SCHED_RR, &param);


另外當程式執行之後,可以使用下列命令,得知各個 Thread 的 priority
$ ps H -C a.out -o 'pid tid pri nice cmd comm'
  PID   TID PRI  NI CMD                         COMMAND
16062 16062  19   0 ./a.out 123                 a.out
16062 16063  41   - ./a.out 123                 ./a_client
注意:此處 PRI 跟使用 top 看到的 priority 會有差距,其換算公式為 priority = 39 - PRI

Reference:


2018年10月20日 星期六

Apple CarPlay

昨天(20180820) 剛花了一萬幫 mazda 3 裝了CarPlay,用此篇來記錄 CarPlay 的參考資料與個人覺得方便的使用方法。

使用方法:
1. 升級至 iOS 12。
2. 安裝 Google Map。
3. 在iPhone 上選擇「設定」>「一般」>「CarPlay」>「Mazda」,調整 app 位置。
4. 手機加上 mazda hub 之後,直接喊 “hi siri" 下命令即可。
例如:“帶我去大遠百”,“播放音樂”,“打電話給xxx"

問題或限制:

  • Mazda 預設音樂播放程式會顯示專輯圖片,CP則不會。
  • Youtube 影片無法鏡像,但聲音可以透過車上喇吧出聲。但使用GoogleMap之後,youtube 聲音會自動暫停。


參考資料:
  • 縮寫
  • AA: Android Auto
  • CP: Car Play


2018年9月23日 星期日

[Embedded] Buildroot -- 建置 gstreamer 的流程

本篇說明如何編譯gstreamer以及相關檔案。為了簡單,僅記錄使用 buildroot 的編譯步驟,如下:

 1. 安裝 buildroot
a. 安裝 buildroot,安裝過程可參考此篇  。
b. 執行下列指令,試試 buildroot 建立的image是否正確。 
$ cd output/images
$ QEMU_AUDIO_DRV=alsa qemu-system-arm -kernel zImage \ -M vexpress-a9 -m 512 -drive file=rootfs.ext2,if=sd,format=raw \ -dtb ./vexpress-v2p-ca9.dtb \ --append "root=/dev/mmcblk0 console=ttyAMA0,115200" -nographic
2. 編譯 gstreamer
a. 設定 gstreamer 選項,再次編譯
$ cd buildroot/buildroot-2017.11
$ make menuconfig
b. ToolChain 設定修改成 glib 
Toolchain -> C library -> glibc  
c. 選擇 gstreamer 
Target packages -> Audio and video applications -> gstreamer 1.x
為了方便使用,建議開啟 gst1-libav, gst1-rtsp-serve 
 
另外 gst1-plugins-base, gst1-plugins-good 也要選擇自己需要的,例如選擇rtsp, alsa, souphttpsrc, videoconvert
d. 重新編譯
$ make clean;make 
e. Test Gstreamer 
$ QEMU_AUDIO_DRV=alsa qemu-system-arm -kernel zImage \ -M vexpress-a9 -m 512 -drive file=rootfs.ext2,if=sd,format=raw \ -dtb ./vexpress-v2p-ca9.dtb \ --append "root=/dev/mmcblk0 console=ttyAMA0,115200" -nographic
$ gst-launch-1.0 -v fakesrc num_buffers=5 ! fakesink 
輸出結果如下:到達此步驟,表示編譯成功。
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.003942000
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Setting pipeline to PAUSED ... 
若是剛剛編譯有加入 souphttpsrc則可以試試此命令 
$ gst-launch-1.0 souphttpsrc is-live=true location=http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 ! hlsdemux ! decodebin ! videorate ! videoconvert ! ximagesink
3. 編譯成功後,若要在嵌入式平台上使用,則要注意相關 library 是否都已存在於平台內。
$ arm-linux-gnueabihf-readelf -d ./gst-launch-1.0
Tag                Type                               Name/Value
0x00000001 (NEEDED)                     Shared library: [libgstreamer-1.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgmodule-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [librt.so.1]
0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
參考資料:


2018年8月3日 星期五

coverity 用法

Coverity 是一套靜態程式碼分析工具,現在可以免費提供使用,以下紀錄用法。

a. 連上網站 https://scan.coverity.com/

b. 選擇 "Sign Up For Free"

c. 接著選擇 "Sing in with GitHub"

d. 選擇 "Add a New Project"

e. 選擇 "Register my GitHub project"

f. 選擇 "Reload repository list from GitHub"

g. 選擇設定想要掃描的 project

h. 下載  Coverity Build Tool
$ https://scan.coverity.com/download/cxx/linux64/cov-analysis-linux64-2017.07.tar.gz
$ tar xvf cov-analysis-linux64-2017.07.tar.gz
$ export PATH=~/cov-analysis-linux64-2017.07/bin:$PATH

i. 接著進行 local build,並將編譯結果壓縮成 tar 檔
$ cov-build --dir cov-int make
$ tar czvf myproject.tgz cov-int

j. 選擇 submit build 上傳 tar file,然後等待 Server 分析結果

參考資料:
https://scan.coverity.com/

2018年4月28日 星期六

Audio 開發參考資料

本篇整理開發Audio應用時的一些參考資料。

Digital Audio 原理
数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹)。
貝(dB)是十分之一貝爾(B):1B = 10dB。1貝爾的兩個功率量的比值是10:1,1貝爾的兩個場量的比值是功率之比是10,則其分貝數湊巧也是10。功率之比是2,則約為3分貝,更精確地說是103/10或1.9953,與2相比較有0.24%的誤差。類似地,3分貝意味著電壓之比約是或1.414。6分貝對應功率增加了4倍,電壓增加了2倍。6分貝的功率之比確切值是106/10或3.9811,與4的誤差為0.5%.

TinyALSA
tinyalsa是Google在Android 4.0之後推的基於alsa內核的用戶層音頻接口。在Android 4.0之前還一直是使用這alsa-lib接口。
1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes.
1 frame of a 5.1 48khz 16bit PCM stream is 12 bytes.

ALSA

Audio Sample

Echo Cancellation

Source Code Example
  • Read Wave File
  • TBD

其他


2018年4月8日 星期日

iMAC 2010 拆機

2010年買的 iMAC,上個月螢幕出現花屏了,問一下店家,修理要8000元,心想乾脆直接買一台新的算了。但是舊的機器還是得要先拆出硬碟,再送回收,下面將此過程作一紀錄。

1. 原本遇到的問題是開機會白屏,怎麼等都無法正常開機。按下 Shift 以安全模式開機,可以開機,但是會花屏,如下,8年前的東西還要花8000元修理,怎麼想都不划算。把堪用的東西拆一拆,然後送回收吧。


2. 拆開過程主要是參考 iFixit 的此篇文章,其實是滿簡單的,只是 iMAC2010 拆開前面板時,有幾條線會連著主板,要小心點拆。圖片整理如下,作個紀錄

第一條要拆的線,先拉一下小黑片,就拆下來了


第二條要拆的線


第三條要拆的線

第四條要拆的線


拆完後的面板背面


 3. 後續拆硬碟、光碟,就不需要什麼技巧了。略。


參考資料:
治療iMac老年癡呆症——更換硬碟(20", Mid 2007) 
[蘋果急診室] 拆螢幕一點都不可怕!簡單三樣工具,讓你輕鬆拆開 iMac 換硬碟並清理灰塵~
【開機技巧】15 個新手必學 Mac 開機組合鍵!
關於 Mac 電腦的啟動音
送修前請試試!Mac 萬用自救兩招:清 NVRAM(PRAM)與重置 SMC

2018年3月10日 星期六

2018年3月4日 星期日

2018年2月18日 星期日

MAC OS 避免 USB NTFS 唯讀的方法

步驟記錄如下:

1. $ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3 
/dev/disk1 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk1
   1:               Windows_NTFS KINGSTON                15.6 GB    disk1s1
此時可以得知 USB 碟的標籤是 KINGSTON

2. $ sudo vi /etc/fstab
LABEL=KINGSTON none ntfs rw,auto,nobrowse
注意:因為設定為 nobrowse,所以以後插入此 USB碟的時候,在 finder 內不會顯示此 USB 碟。
3. 移除 USB, 重新插入一次

4. $ sudo ln -s /Volumes ~/Desktop/Volumes


參考資料:


2018年2月13日 星期二

2018年1月30日 星期二

[Embedded] convert binary data to c array

將二進位資料轉換成 C 語言的陣列,是程序員常會用到的一個小技巧。本篇以一個例子說明如何在 linux 環境下達到此目的。

2018年1月27日 星期六

在 MAC 平台使用 astyle

astyle 是一個幫忙程式碼排版的工作,本篇記錄在 MAC 平台上使用 astyle 的過程。

2018年1月14日 星期日

2017年12月28日 星期四

[QEMU] 模擬一個實際的 ARM Linux 嵌入式系統

本篇紀錄手動自行建置系統的過程。若想盡可能的自動化進行建置,請使用 yocto 或是 buildroot。

1. 安裝 qemu
$ sudo apt-get install qemu-system-arm

2. 建立測試目錄,下載 toochain 以及 kernel
$ mkdir qemu_test
$ cd qemu_test
$ wget https://releases.linaro.org/components/toolchain/binaries/6.4-2017.11/arm-linux-gnueabihf/ gcc-linaro-6.4.1-2017.11-i686_arm-linux-gnueabihf.tar.xz
$ tar xvf gcc-linaro-6.4.1-2017.11-i686_arm-linux-gnueabihf.tar.xz
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz
$ tar xvf ./linux-4.14.tar.xz

3. 修改環境變數
$ vi ~/.bashrc
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/albert/qemu_test/gcc-linaro-6.4.1-2017.11-i686_arm-linux-gnueabihf/bin
$ source ~/.bashrc 

4. 編譯 kernel
$ cd linux-4.14
$ vi arch/arm/configs/vexpress_defconfig
參考此篇 http://awe31402-blog.logdown.com/posts/528593 
$ make vexpress_defconfig
$ make clean;make
$ ls -al arch/arm/boot/dts/*.dtb
此時應該會出現 vexpress-v2p-ca9.dtb
$ ls -al ./arch/arm/boot/
此處應該會出現 zImage

5. 建立虛擬網卡介面
$ sudo apt-get install uml-utilities
$ sudo tunctl -t tap0 -u albert
$ sudo ifconfig tap0 192.168.7.1 netmask 255.255.255.0 promisc

6. 建立 nfs 使用的 rootfs (之前已經透過 yocto 建立,此步驟省略)

7. 執行程式
$ cd ~/qemu_test
$ QEMU_AUDIO_DRV=none qemu-system-arm -kernel ./linux-4.14/arch/arm/boot/zImage  -M vexpress-a9 -m 512 \
-dtb ./linux-4.14/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-append "/dev/nfs nfsroot=192.168.7.1:/srv/nfs/qemuarm rw ip=192.168.7.2:192.168.7.1:255.255.255.0 console=ttyAMA0,115200" \
-smp 1 -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no -nographic

參考資料:
http://awe31402-blog.logdown.com/posts/528593
http://daydreamer.idv.tw/rewrite.php/read-42.html




2017年7月9日 星期日

mp3 檔案移除封面資訊

現在網路上取得的 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
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:
  1. https://how-to-build-for-arm.wikispaces.com/readline
  2. http://www.plunk.org/~hatch/goodies/backtracefilt.C
  3. https://github.com/CarloWood/libmemleak
  4. http://stackoverflow.com/questions/34732/how-do-i-list-the-symbols-in-a-so-file
  5. https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Leaks