2012年8月25日 星期六

如何使用gsr偵測Memory Leakage

GSR是我們Project裡用來反覆執行相同動作的tool,主要可以用在系統開發階段後期,對於開發好的AP或是component進行壓力測試,順便也可以偵測記憶體使用情況,例如Lauhch與Exit某支AP,當這個動作運行5000次後,計算Memory的使用情況,藉此某個AP或是component 是否有Memory Leakage。


2012年8月4日 星期六

[Linux] 遞迴搜尋文字-grep

在Linux底下很常使用grep去搜尋某些特定字串,有一些使用方式記錄下來,可以方便以後快速查詢。

[root@www ~]# grep [-acinv] [--color=auto] '搜尋字串' filename
選項與參數:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
--color=auto :可以將找到的關鍵字部分加上顏色的顯示喔!


1.以 grep 尋找一個檔案中的文字:
grep "abc" file.txt
2.如果要在子資料夾間搜尋,可以用
grep -r "abc" .
來完成,以 -r 來表示要遞迴子資料夾,而 . 則是代表由所在資料夾開始搜尋。
3.還可以用 --include 來指示目標檔案名稱:
grep -r --include="*.php" abc .
或用 --exclude 來排除一些檔案:

2012年7月27日 星期五

[Git] 工作上常使用到的git指令


@可以看某個git check point的詳細紀錄 
git log -p -l 2afeedb08454260516db332d70e661c3ae35e216 

@git 退版 
git checkout -b GoogleReader 2afeedb08454260516db332d70e661c3ae35e216 
說明:新增一個GoogleReader的branch並還原到後面commit point的時間版本 

@建立git push rule的範本 
git config commit.template ~/git-template 

@建立新的branch 
git branch 'branch name' 
Ex. git branch working; //建立一個名字為working的branch 

@刪除branch 
git branch -D 

@只加修改過的檔案, 新增的檔案不加入 
git add -u

2012年7月21日 星期六

[Android] android debug tool - addr2line


一、目的
當程式運作遇到segmentation fault時,可以使用工具來偵測發生錯誤的位置。

二、範例如下所示
通常一旦出錯,錯誤訊息都會秀出這樣的log,只要記錄下address,就可透過addr2line偵測到程式碼哪一個function出錯。

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

三、使用指令如下

格式:arm-linux-androideabi-addr2line -Cfi -e xxx.so 123456

實際使用:arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

2012年5月25日 星期五

[Android] Android resource觀念整理

以下整理一下Android resource核心的觀念跟作法,android resource其實也是一個複雜的東西,包含Style與Theme的撰寫,兩者的差異在哪,
以下列出幾點問題如果可以釐清,我想對於應該就已經攻破android resource了。
1.Resource有哪些,String、Color、boolean.......
2.各個名詞解釋,style、theme、attr是什麼,要能夠口頭敘述出來。
2.AttributeSet跟TypedArray是什麼? 兩者有什麼關聯性,在程式碼中怎麼使用。
3.Styleable是什麼,跟style有關嗎?


2011年11月29日 星期二

dynamic linking library in linux

最近看到許多linux的新一點的project許多都使用dynamic linking來架構其C程式,其中dlopen這個系列雖然是很lightweight但是卻十分好用,幾年前看到dlopen的使用便覺得很酷,因此寫一個粗淺的文章來談談dlopen library。

不了解dynamic linking library嗎?我想一個例子便是Microsoft的COM架構,這類的方式有許多好處,首先是對於軟體設計人員可以更自由的與其他人開發的library獨立開發。這裡要知道的是他確實是dynamic的來連結,一般的library的linking多是在linker的階段完成,也就是說在你執行ld的時候(或是由gcc呼叫ld)便將library與執行檔的symbol link完成。因此就算你是用shared library依然在link stage後便會與特定的library有連結。

原本這樣的做法很OK,但是隨著軟體設計的彈性需求越來越被重視,一個問題開始出現:我們是不是可以在程式執行時期再來決定library的symbol link。因此一堆相對應的方式開始產生,Microsoft的COM元件便是很成功的一個方案,然而早期在linux卻苦無解決方案,直到dlopen這個library的出現。

其實他很簡單,大多數的動作都可以只用3個function便可以做完,分別是dlopen、dlsym與dlclose。dlopen當然是用來開啟一個動態連結的library,dlsym用來載入相關的symbol link,dlclose用來關閉library。我想這樣應該是有點難以了解,因此我們用一個簡單的例子來說明吧。假設我們有些情況需要求出一個連續整數的平方和,有時候卻要求立方和,現在假設求完和後的程式就跟求平方和或立方和的運算無關了,而且或許未來有4次方和或更高次方的需求,我想這是個可以考慮用dlopen來解決的狀況(好啦...這個例子太殺雞用牛刀...不過只是為了說明....睜隻眼閉隻眼吧)。

首先我們必須先定義好我們的dynamic linking library的interface,因此我們寫下了定義的include檔如下
struct integer_list {
        struct integer_list *next;
        int num;
};

typedef void(*show_info)();
typedef int(*begin_calc)(struct integer_list *l);

typedef struct _func_plugin
{
        show_info info;
        begin_calc calc;
} func_plugin;

typedef func_plugin*(*get_plugin_interface)();
首先,因為我們要有一串未定長度的整數,因此我們用linked list來儲存他(這時候就會很懷念C++ STL的vector),這個介面只需要一個計算的function,但為了說明清楚一點,我們再給他一個秀出自己訊息的function。將他包在一個結構中後,在定義一個回傳symbol的function就可以。

當我們要用到這些動態的library的時候,我們可以用剛剛提到的3個function來處理,這裡我定義一個function來計算如下
int use_plugin(char *plugin_file, struct integer_list *n)
{
        void* plugin;
        func_plugin *f;
        int result=-1;

        plugin = dlopen(plugin_file, RTLD_NOW);
        if (!plugin)
        {
                printf("Open plugin error\n");
                return -1;
        }
        get_plugin_interface get_func;
        get_func = (get_plugin_interface) dlsym(plugin, "get_plugin");

        if (!get_func)
        {
                printf("dlsym error\n");
                dlclose(plugin);
                return -1;
        }

        f = get_func();
        f->info();
        result =  f->calc(n);

        dlclose(plugin);

        return result;
}
你可以看到這個函數接受兩個參數,一個是我們要使用的library的位置,另一個是我們要計算的整數列,軟體開發者在開發階段已經可以利用dl library將程式編譯成執行檔而不用去在意library的實作,當然你在程式要去輸入你要使用的library位置(command-line參數或設定檔....隨你高興吧)。

最後是我們怎麼完成一個獨立的library的時候了,一個簡單的做法如下
#include 
#include 
#include 
#include "func_plugin.h"

void sqar_sum_info()
{
        printf("This plugin is about square sum\n");
}

int sqar_sum_calc(struct integer_list *l)
{
        int result=0;
        struct integer_list *tmp = l;

        while(tmp != NULL)
        {
                result += (tmp->num * tmp->num);
                tmp = tmp->next;
        }

        return result;
}

func_plugin square_sum_plugin =
{
        sqar_sum_info,
        sqar_sum_calc
};

func_plugin *get_plugin()
{
        return &square_sum_plugin;
}
很簡單吧,你只要去真正實作介面定義的函式便好,因此假設我們這個程式檔叫作square_sum.c,我們可以這樣製造出我們要的library
gcc -shared -fPIC -W1,-soname,libsqr_sum.so -o libsqr_sum.so square_sum.c 
這樣一來我們的簡單示範就完成啦,因此你可以發現你可以任意替換掉計算的部份,只要你傳入不同的library進去。下次要開始你的project之前或許先想想是否有一些部份也是有這方面需求,試試dl library來完成你複雜的架構吧。不過.....台灣的軟體開發好像最不給開始的規劃時間....ㄏㄏ.....算了,engineer們,玩的高興就好。

轉貼自:http://sites.google.com/site/joepasscheng/dynamiclink

2011年10月29日 星期六

[Flex]如何在tree中使用搜尋功能

Flex裡內建的元件非常豐富,都是能幫助我們能夠快速開發的好幫手, 今天要介紹一下tree此元件,有使用過的人都曉得,若目前要開發的功能 需要主副階層的呈現方式,那麼List可能就不符合我們所想要的囉!此時 tree就派上用場了,本文要介紹就是當tree的類別累積未來越多時,如何 透過搜尋的欄位,快速找尋到我們所要的項目。