開源工具現狀

許多開發者都有介入中大型專案的經驗,常必須試圖理解原始程式的設計,或多或少都有在程式碼迷宮中找路的經驗。有些專案,程式碼結構嚴謹,軟體設計應用 Design Patterns. 見名稱、參數即可推斷程式結構,閱讀如沐春風。

但若碰到未經重構的成年老專案,程式邏輯因為年久失修,塞滿各個開發階段的臨時解決方案,常常已經複雜到難以一眼望穿理解。若是像記憶力虛弱如我,常常追了後面幾千行、跳了三個檔,就忘了前面幾個檔案的函式名稱。於是常常輔助紙本畫流程圖,但是手繪圖往往不敵跳來繞去的程式碼邏輯。還是得靠程式碼解析視覺化工具來協助理解。

繪製 Call Graph 的工具非常多,一般可以分作 Dynamic analysisStatic analysis 兩種做法。在臺灣,最知名的商業版本工具,大概是 Source Insight。不過我不用 Windows,對於缺乏原始碼的開發工具興趣也不大。

開源的 Dynamic analysis 有像是 Jserv 介紹過CodeViz 或是 ncc。不過這類工具需要 patch gcc,不特別適合嵌入式系統專案。因爲原始碼常常只支援特定平臺,或是無法取得編譯工具原始碼,此外不同版本的 compiler 偶爾會造成不同的問題,造成使用上的困難。

一種比較乾淨的做法是像 KCachegrind 利用 valgrind 來收集資料,或 Gprof2Dot 利用 gprof 的輸出資料。再者是利用 gcc 的除錯功能,把 internal representation (RTL) 倒出來,再用egyptPython-RTL 來判讀或繪圖。

至於 Static analysisFred Chien 介紹過cflow 或是 Doxygen 也有類似的繪圖功能。也有工具是配合 cscopeglobal,例如有人幫 CScope 刻過圖形界面,Vim 有個 CCTree 可用。

CallGraphviz

以上這些工具各有優缺點。

最常見的問題是許多工具無法處理 function pointer / dynamic dispatch,最終還是要人力介入。另外一個使用上的困擾是,這些程式會一口氣畫出整個程式碼的結構圖。

太多資訊其實妨礙理解,因爲用途常常只是追一個臭蟲,程式開發者只想畫出特定路徑來釐清問題。而context-sensitive 的 call graph 測試工具又耗費資源。

若用 CodeLite, Code Blocks , Eclipse CDT 等開發工具,工具已經內建或整合 cscope /global,提供 symbol lookup 功能,於是開發者很容易用滑鼠查閱函式定義或實做,或也可以搭配 LXR 來瀏覽程式碼。已經不需要像是 cbrowser 專屬的程式碼瀏覽工具

所以需要的是可以手動的將目前程式情境視覺化的工具,網路上已經有其他開發者做了 Bash: C Call Trees and Graphs 或是 Global-calltree。或是像 ypwang方法,記錄函式進出點,再手動繪圖。

這些工具大多是整合 shell scripts,操作上有點不便。另外我也不喜歡 Call Tree 的圖式,因爲樹狀圖無法表現遞迴或交互關係。

於是查找一下,決定拿 cscope 加上 GraphvizDOT 語法來用,改了一個 CallGraphviz。它的功能是一個 Graphviz 前端,後端還是使用 cscope 查 symbols,為了可以即時瀏覽就拿了 xdot 當作界面。xdot 是以 PyGtk 開發,非常容易更改,不到三百行就加入我需要的功能。
 

使用方法

  • python visualizer.py
  • 按下 “New”, 選擇要分析 C/C++ 專案目錄。
  • 於 “Search symbol” 鍵入要追蹤的函式名稱。
  • 每次鍵入新名稱,他會自動對應圖中已輸入函式是否爲 caller or callee,並自動畫圖。

CallGraphviz 可以將繪圖結果存成 dot 格式檔案,然後再利用 dot 指令轉換格式。不過它只是把曾經查過的名稱記錄起來,開啟時重新查 cscope 而已,若圖大時,每次開啟可能會十分緩慢。

原始碼可於 github 下載,授權採用 GNU Lesser General Public License.

延伸閱讀
Python Call Graph

Nautilus 自從 2004 釋出的 Gnome 2.6 後整合了 Python Plugin 介面,相較於 C API,用 Python 來刻外掛軟體顯然要快速方便多了,而且彈性也比 G-Script 好多了。只要稍微了解 Nautilus 架構,再配合 Python 與 GTK/Gnome 的 binding library,就可以很輕易的在選單上添加新的功能。

其中一個利用 Nautilus Python binding 刻的好用軟體就是 postr, 是一個方便上傳照片到 Flickr 的小工具,以 Python 寫成。安裝後重新啟動 Nautilus 後,就可以於圖檔檔案之右鍵選單中找到 “Upload to Flickr” 上傳功能。

介面提供了基本的編輯介面,你可以逐一設定每個檔案的名稱、敘述、Tags 或加進特定的群組中。也可以一次上傳數個檔案,還算相當實用方便的小工具。

另外一個類似的工具是 Desktop Flickr Organizer for GNOME (以 Mono 開發),管理功能更強大,可以用以維護或備份已上傳的資料。但相較之下比較不穩定,許多例外都尚未妥善處理,偶爾會無法正常運作。

這陣子,不少人都瘋著看奧運轉播,特別是棒球賽。(現在不需要再看了..*默*)

不過中華電信 hiChannel 所提供的奧運線上轉播使用了 Microsoft Windows Media DRM 機制,限制微軟平台的用戶可以使用。於是,你必須在 Windows 平台上使用瀏覽器,才能取得授權後觀看。

你可能想使用 Wine 裝 Windows Media Player 與 IE 來接取 hiChannel 的節目,不過 Microsoft DRM 需要驗證簽署過的 Windows 核心與驅動程式 (Bug 14761),即使透過 Wine 跑 Windows Media Player 也是沒轍的。

就算你很高明的攔截到 mms 網址,mplayer 也會因為讀到加密的 asf 格式,而抱怨 “This file has been encumbered with DRM encryption, it will not play in MPlayer!“。除非你先參考 [MS-DRM]: Digital Rights Management License Acquisition Data Structure 實做了 Linux 客戶端,或者認真讀了 Beale Screamer 的 Microsoft’s Digital Rights Management Scheme – Technical Details,把 content key 偷解出來,如此就可以透過 mplayer/libavformat 直接觀看 hiChannel 的 asf 串流。

因此,雖然中華電信 hiChannel 免費提供轉播服務,Linux 平台的使用者依然無福享受。

所幸,中華電信的另外一個數位家庭服務,也提供了線上轉播的服務給註冊會員使用,目前開放註冊後免費試用一個月的優惠,而且解析度 (640×480) 比 hiChannel 還高。但麻煩的是,你得使用 Windows Media Player 11 才能登入、註冊,而且註冊程序不甚方便

好東西是,數位家庭服務最後提供的串流是沒有加密的,於是你可以直接用 mplayer 或任何可以解 WMV3 格式的播放軟體開。於是,我註冊了個帳號,並隨手用 Python/GTK+/Gstreamer 為自己寫了個播放小程式,讓我可以在 Debian GNU/Linux 上觀看轉播

目前這個瀏覽軟體只擺了五個奧運轉播頻道,預期一個月內失效。執行需要 python2.5, python-gtk2, python-gst0.10. 欲觀看視訊服務,請洽 數位家庭服務

FourDollars – 轉播程式寫好了,戰況討論聊天室就交給你了。;-)

哇,若你是個 Geek, 而且對 Linux, Python, Open Source Software 感興趣,你大約已經常常閱覽 Reddit.com,Reddit 是一個 Social bookmark 網站,使用族群較為偏熟悉技術的工程師。

就像所有的 Social Bookmark 一樣,首頁的排序與計算方式總是受到質疑與挑戰。於是 Reddit 乾脆就把整個網站的程式碼開放原碼,於是所有人都可以看到演算法與修改,也可以回饋建議、甚至 Patch。程式碼可於 code.reddit.com 下載。目前 Reddit 用的其他開放原始碼軟體還包含 Debian, lighttpd, HAProxy, PostgreSQL, Slony-I, 數個 Python libraries, Psychopg, pylons, Solr, Tomcat, Ganglia, Mercurial, Git, gettext, daemontoolsmemcached 等。

於是,好事者再也沒有理由質疑 Reddit 動了手腳。

reddit goes open source: message from the alien mascot

剛剛試著查找一些 GAE 的相關應用資訊的時候,在 App Gallery 上看到幾個還算不錯的好玩網站,其中不少 Twitter 類似或使用 Twitter 資料的網站 (因為 twitter 越來越難用了?)

如果你還不知道 GAE 是甚麼,不妨花幾分鐘聽一下 Google 在 Campfire One 的簡短說明,其中 Guido van Rossum (Python 的作者, Google App Engine 成員之一) 也給了一段演講

Campfire One: Introducing Google App Engine (pt. 1)

Campfire One: Introducing Google App Engine (pt. 2)

Campfire One: Introducing Google App Engine (pt. 4)

Campfire One: Introducing Google App Engine (pt. 5)

Campfire One: Introducing Google App Engine (pt. 6)