2010年11月13日 星期六

gcov - linux code coverage analysis tool

0 意見
gcov也是一款linux底下用來分析程式的tool,透過gcov的處理,programmer可以快速地得知每一行instruction在整個執行過程中總共執行過幾次,以便修改code來改善程式的品質

環境

作業系統: Linux OS
軟體: gcov & gcc(or g++)

前置步驟

1.編譯程式
使用gcc(or g++)編譯source code時加上-ftest-coverage -fprofile-arcs參數
[awkman@edalab ~]$ g++ -ftest-coverage -fprofile-arcs fm.cpp -o fm

2.執行程式
完整跑完編譯出來的程式後,會自動產生一.gcno .gcda檔案在當前工作目錄內

3.利用gcov產生想分析的source code的檔案
[awkman@edalab ~]$ gcov fm.cpp

4.檢視(請用習慣的editor開啟)上一步產生的分析檔
[awkman@edalab ~]$ vi fm.cpp.gcov


gcov文件內容

gcov產生的文件很簡單,就是原本的原始碼再加上在每一行的左邊都有行數和執行的次數,如果是#####代表該行instruction沒有執行過


Reference

GNU/Linux Application Programming
感謝NCKU IDEAL Lab 碩一同學暑假期間的教學

gprof - linux program profiling tool

1 意見
廢話

上星期五FM作業在同學的指導之下終於生出個形出來,帶著依然存在無數個謎樣bug的程式和NB回下營後,隨即躺平睡覺,儲備星期六要用來和作業決一死戰的HP和MP(?)

享受完寫出最快最好FM的喜悅後,我在夢裡一巴掌將自己給打醒......嗯…果然是夢沒錯= =……..,看看時間7點多,到客廳跟老姐領早餐就回到房間閉關了

改到快中午時,bug差不多都解完了,但是程式還是沒辦法在我理性斷線前跑完…..沒錯…..他就是沒辦法跑完~!@#$%^&,正當我隨手抓起桌上的筆筒準備和它拼命時,我突然想起之前IDEAL Lab的同學曾經介紹過一些tool,好像有一個linux下的tool叫gprof,正是用來profiling程式用的!!!

廢話好像太多了…….

介紹

gprof是一個可以用來檢視程式碼執行時間分佈的工具,藉由gprof產生的文件可以快速地得知程式的瓶頸到底在哪~

環境

作業系統: Linux (Windows的話可以看看cygwin有沒有下面提到的軟體@@a)
軟體: gcc(or g++), gprof

使用方法

1.編譯程式
使用gcc(or g++)編譯source code時加上-gp參數
[awkman@edalab ~]$ g++ -pg fm.cpp -o fm

2.執行程式
完整跑完編譯出來的程式後,會自動產生一個gmon.out檔案在當前工作目錄內

3.利用gprof產生適合地球生物閱讀的文件
gprof 程式名稱 gmon.out > 任意名稱
[awkman@edalab ~]$ grpof fm gmon.out > fm.gprof

4.檢視(請用習慣的editor開啟)上一步產生的分析檔(會有上下兩部分)
[awkman@edalab ~]$ vi fm.gprof 

profile 文件內容

上半部Example:
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 33.34      0.02     0.02     7208     0.00     0.00  open
 16.67      0.03     0.01      244     0.04     0.12  offtime
 16.67      0.04     0.01        8     1.25     1.25  memccpy
 16.67      0.05     0.01        7     1.43     1.43  write
 16.67      0.06     0.01                             mcount
  0.00      0.06     0.00      236     0.00     0.00  tzset
  0.00      0.06     0.00      192     0.00     0.00  tolower
  0.00      0.06     0.00       47     0.00     0.00  strlen
  0.00      0.06     0.00       45     0.00     0.00  strchr
  0.00      0.06     0.00        1     0.00    50.00  main
  0.00      0.06     0.00        1     0.00     0.00  memcpy
  0.00      0.06     0.00        1     0.00    10.11  print
  0.00      0.06     0.00        1     0.00     0.00  profil
  0.00      0.06     0.00        1     0.00    50.00  report
欄位說明(以紅色行為例):
% time : memccpy()執行時間佔所有runtime的比例
cumulative seconds: 累計執行時間(table中所有在memccpy()上方function 的執行時間也會加入計總,如open()和offtime())
self seconds: 執行過程中,memccpy()的執行時間
calls: 執行過程中,memccpy()被呼叫的次數
self ms/call: 每次被呼叫時 平均花費了多少milliseconds執行memccpy() function
total ms/call: 每次被呼叫時,平均花費了多milliseconds執行memccpy()和memccpy()中呼叫的routine
name: function 名稱

下半部Example:
index % time    self  children    called     name
                                                 <spontaneous>
[1]    100.0    0.00    0.05                 start [1]
                0.00    0.05       1/1           main [2]
                0.00    0.00       1/2           on_exit [28]
                0.00    0.00       1/1           exit [59]
-----------------------------------------------
                0.00    0.05       1/1           start [1]
[2]    100.0    0.00    0.05       1         main [2]
                0.00    0.05       1/1           report [3]
-----------------------------------------------
                0.00    0.05       1/1           main [2]
[3]    100.0    0.00    0.05       1         report [3]
                0.00    0.03       8/8           timelocal [6]
                0.00    0.01       1/1           print [9]
                0.00    0.01       9/9           fgets [12]
                0.00    0.00      12/34          strncmp <cycle 1> [40]
                0.00    0.00       8/8           lookup [20]
                0.00    0.00       1/1           fopen [21]
                0.00    0.00       8/8           chewtime [24]
                0.00    0.00       8/16          skipspace [44]
-----------------------------------------------
[4]     59.8    0.01        0.02       8+472     <cycle 2 as a whole>    [4]
                0.01        0.02     244+260         offtime <cycle 2> [7]
                0.00        0.00     236+1           tzset <cycle 2> [26]
-----------------------------------------------

primary line(第一個欄位有出現[數字]的那幾行,這裡拿紅色行為例):
欄位說明
index: report()的index
% time: report()執行時間在所有runtime所佔的比例(包含report()中呼叫的subroutine的執行時間)
self: 同上一個table的self seconds
children: report()中呼叫的subroutine的執行時間
called: report()被呼叫的次數,如果是遞迴呼叫,會有兩個數字,第一個數字表示非遞迴呼叫的次數,第二個數字表示遞迴呼叫的次數(如藍色行)

caller line(dash line到primary line之間,此例中以綠色行為例):
欄位說明
self: 呼叫report()所花費的執行時間(不含report()中又去呼叫其它subroutine的執行時間)
children: report()呼叫其它subroutine的執行時間
self + children的總合等於report()被main()呼叫後的實際執行時間
called: 兩個數字,第一個代表report()被main()呼叫的次數,第二個數字代表被所有caller functions(程式可能也會有其它function呼叫report())呼叫的次數
name: function 名稱

subroutine line(灰色行):
欄位說明
self: 被report()呼叫後的執行時間(不含執行其它subroutine的時間)
children: 被report()呼叫後,執行其它subroutine的時間
self + children的時間等於此subroutine被report()呼叫後的執行時間
called: 兩個數字,第一個數字代表在report()是被main()呼叫的狀況之下,此function被report()呼叫的次數,第二個數字代表整個程式的執行過程中,被report()呼叫的次數(不限定report()必須被main() 呼叫)

分析範例

上面可能寫的有些模糊,以下拿個例子來說明一下
-----------------------------------------------
                0.00    0.05       1/1           main [2]
[3]    100.0    0.00    0.05       1         report [3]
                0.00    0.03       8/8           timelocal [6]
                0.00    0.01       1/1           print [9]
                0.00    0.01       9/9           fgets [12]
                0.00    0.00      12/34          strncmp  [40]
                0.00    0.00       8/8           lookup [20]
                0.00    0.00       1/1           fopen [21]
                0.00    0.00       8/8           chewtime [24]
                0.00    0.00       8/16          skipspace [44]
-----------------------------------------------
此block主要是顯示report()被main()呼叫後執行時間和次數的資訊

由caller line(綠色行)可以得知在整個程式執行過程中,report()總共只被main()呼叫過一次而已(因為called欄位的兩個數字都是1),main()呼叫report()後,實際在report()中(不含執行其它subroutine的時間)執行的時間為0.00(self),report()呼叫的其它subroutine的執行時間為0.05(children)

由primary line(紅色行)可以得知,report()只被main()呼叫一次(called),在report()中(不含執行其它subroutine的時間)花費的執行時間為0.00,report()中呼叫其它subroutine的執行時間為0.05

由subroutine line(灰色行)可以得知, timelocal()在整個程式執行過程,只會被report()呼叫8次(因為called欄位兩個數字都是8),timelocal()自己的執行時間(不含執行其它subroutine的時間)為0.00(self),timelocal()中呼叫其它subroutine的執行時間為0.03(children)

Reference

GNU gprof profile範例來源
GNU/Linux Application Programming
感謝NCKU IDEAL Lab碩一同學暑假期間的教學

2010年5月9日 星期日

下營玄天上帝廟廟會活動

0 意見
結束了一個禮拜的coding生活後回到了下營,雖然每個禮拜五都會回家報到,不過這次特別興奮,因為隔天就可以體驗期待已久的抬神轎@@。

回到家立刻打給老爸報備一下明天的廟會行程,不過卻得到一個悲慘的回應,老爸叫我隔天(4/17)先不要去抬,先去幫大伯處理一下電腦的問題...~!@#$%

喪氣之餘打開電視看點節目來殺殺時間...

不久後蠢豬意外地殺到家裡來,讓我嚇了一跳= =,這傢伙之前明明就跟我說要期中考不回來的...阿璋也來了之後三個人就一起出們覓食去了


入侵房間的兩名黑衣男子...














買雞排結帳的時候,順便跟老闆多要了兩個袋子要去廟裡拿些掛在神像上的餅乾... 本來想說兩個袋子應該是還好,沒想到到了廟裡開始拔餅乾的時候,發現旁邊的民眾大都只拿個幾塊就離開,還有一個小妹妹拿了沒幾塊就被媽媽制止...我開始覺得有點囧了,轉頭跟拿得眼正紅的蠢豬說:「人家小妹妹都停了,我們還要繼續拔嗎 <囧?  」,三個人一陣沉默後.....就往下一尊神像出發了..... XD

收手後就去蠢豬家坐了一整晚上~

隔天(4/17)早早起床去大伯家搞定電腦後繼續回家看球賽&補眠 = =||
下午就站在家附近的巷子看繞境的隊伍

















































































































然後晚上又去蠢豬晃了一晚XD

吃爽爽的蠢豬XD














不配合拍照的阿璋...














不知道在笑啥的我 XD















終於,4/18這天來到了!!!
早上六點半和老爸出門吃完早餐就直接去廟前集合

等待出發的眾人~














等待出發中@@a














等待出發的神轎














前面的212個陣頭和神轎出發後就換我們負責的玄天大上帝出發了!!!
沒想到一出發就塞車= =||等了一會兒後,第一批要鑽轎人潮就來了,第一次抬著神轎從一排跪拜姿勢的人群走過去感覺還蠻奇特的,有一種就算拼了也要讓眼前的群眾都能來沾沾等了三年的神明祝福的使命感。

抬壽星的轎子其實很快就累了(雖然不知道是我自己太弱雞還是真的是這樣子...),因為走沒幾步就會有一排要鑽轎的民眾出現,不習慣的人真的會有點吃不消,同行的長輩怕我第一次抬就被嚇跑,只讓我抬了一段就搶走我的工作了= =||,我還可以啊!!!!!!!!!!!

最後我就退到轎旁中央,當有要鑽轎民眾時再幫忙將轎子抬高或擺置在肩上(有時前面塞太嚴重的話,我們只能將轎子原地抬高,讓民眾自行走過轎下),就這樣一直走到中午12點到了下營農會讓下一班的人接手後,我們的任務就完成了!!!

回到家後整個累攤,喝了幾口水後就一路睡到4點了...

4點起床後開始看電視殺殺時間~(還是很累啊....)

到了6點左右,第一個電話來了!!!拿帕出場!!!!不過在這時發生了一些小狀況,因為要來一起吃流水席的人(阿璋、拿帕、建文)我都約在6點....結果變成載著拿帕到鳳和帶建文,然後再去阿璋家...浪費了大家不少時間(回到伯父家時其它桌的人幾乎都吃完了.....囧)

四個人開始清桌行動,不過看來我將一切想得太完美了,四個人只清完1/3的食物.... 剩下的全浪費掉了,下次還有機會一定要拉更多人來幫忙才行Orz

茶飽飯足後四個人步行到廟前看神轎入廟,不過到的時候已經沒有好位置了,太跨張了....也才快八點而己,最後大家就決定散會了~

帶建文回省道後準備回家休息,結果沒想到唯一回家的小巷還有神轎在繞........回不了家的我只好摸摸鼻子再到廟前去看看有沒有位置可以看入廟......還好發生了這段小插曲,拆返回廟前後沒花多少時間就找到一個有不錯視野的位置!!!!!不然都沒看到入廟感覺怪怪的...

看了3個小時的入廟後,12點就拖著疲憊的身體滾蛋回家洗澡睡覺,結束了這次的活動了^ ^

感謝這次願意來捧場的朋友們~也希望這次不便來作客的朋友們,下次能有機會讓我一盡地主之誼 ~~

2010年1月17日 星期日

整理筆電

0 意見
週末花了一些時間重灌NB,第一次裝win 7發生了不少預料外的狀況...不過無傷大雅,不熟悉的系統總會需要一段陣痛期的,寫篇文章記錄一下遇到的狀況和查到的solution

1.重新安裝win 7時,如果硬碟是未分割的狀態,安裝程式會強制分割一個100MB的分割區來放置開機相關檔案,所以會變成至少要兩個分割區才能安裝win 7

solution:安裝win 7之前先用spfdisk或其它磁碟工具分割好要用來安裝win7的分割區,等到要安裝時直接指定該分割區來安裝就好了

2.製作開機選單軟體可以使用spfdisk也可以用easyBCD

3.如果遇到1.提到的狀況時,如果不小心用其它軟體設錯啓動分割區時會無法開機

solution:100MB那個磁區才是放置和開機有關的檔案,所以只要將100MB那個磁區設為啓動磁區就能正常開機了

BTW,原來是打算要裝win 7 & fedora 12的,結果不知道是不是抓錯fedora的iso檔,安裝過程需要連上網路才給裝...後來就改成灌fedora 11了...也因些筆電變成7-11機了(win 7 & fedora 11) XDD

2010年1月3日 星期日

天地小聚

0 意見
今天(其實是昨天...)終於有機會可以來個愜意的天地聚餐了,看到標題的"小"字應該就不難得知其實人數有點...少= =||,也沒辦法,年紀越大這種大家都有事要忙的狀況應該是會越來越常見才是,前幾天問阿樸說「你元旦真的不回台南嗎@@?」,阿樸:「嗯,騎回去太累了」,我:「..................................」,好吧,我投降Orz。張老二也有事不回台南,某睿則是因為我前幾天太忙了,完全忘記要通知他了,應該算是被我暗黑掉了...囧,吃飯時因此被太白念了數次,我對不起你XD

好久不見,大家又持續的成長和演化(?)了不少,嫩法儼然快成為一個專業的攝影專家了,突然又勾起當初想買單眼把玩結果卻把預算拿去矯正的往事(說好不提單眼的...),而且南師弟也說北部開始有人手一隻單眼的情況出現了,看來消費型DC的市場好像也快邁向LCD之路了,相當有趣!

阿昇依舊在研究一些刁鑽的東西XD,不過當初的工作問題現在好像是頗平穩了,持續接觸不同領域的好習慣真的是天地中的好榜樣!重點是研究完都還能整理個大綱在每次聚會中分享給大家,不像我都忘光光了...

太白也過的不錯,終於走出近期的低潮,整頓好自己準備向新目標伸出魔掌了!而且我覺得偶爾就開個課的狀況變少了XD,休養依舊持續提升,但是分享給大家的方式更棒了,不像以往強硬,good job!

從之前國高中大家天天見面,到現在上了大學偶爾相聚,彼此的情感提升到下一個境界,這種感覺真的相當的棒,不過我還是希望有機會的話,來個全員到齊吧!哈哈哈哈= =+