跳到主要內容

發表文章

目前顯示的是有「utility」標籤的文章

Take a look at CMake

Overview CMake  is a cross-platform build tool like  GNU build system , but it's much easier to use and faster than GNU build system. It is designed to build software written by C, C++ or Java. It adds a lot of implicit rules to help programmer with few configurations. This article will explain how to use this powerful tool step by step with workable examples. We will talk about the details of each syntax we use here but not try to exhaust all syntax CMake has. If you want to dig into CMake, please refer to its  document .  The version of CMake we use is 2.8.7 on Ubuntu 12.04. However, we just use the basic syntax. It sould be okay if you use other versions and on other platforms. First example - say hello                                                                       ...

perforce bug? fix p4v

perforce 是一個商業公司所出的 VCS ,有不少公司採用 (雖然我覺得很不順手...) ,包括我目前待的公司,在 Linux 上安裝其圖形操作介面後,一執行居然吐出 abort...WTF?! 由於它們只提供 binary 檔,無法確認問題。根據經驗,很多開源軟體都要讀取設定檔,但往往在檔案不存在的情況下用錯誤的模式而無法開啟,然後又不檢查是否開啟成功就使用 file descriptor,所以就會掛點。不過 perforce 是一家那麼久的軟體公司耶!應該不會犯這種低級錯誤吧?不管了,死馬當活馬醫,用 strace 觀察一下,結果真的看到: stat64("/home/mars/.p4qt/ApplicationSettings.xml", 0xa547e6c) = -1 ENOENT (No such file or directory) lstat64("/home/mars/.p4qt/ApplicationSettings.xml", 0xbf983a30) = -1 ENOENT (No such file or directory) open("/home/mars/.p4qt/log.config", O_RDONLY|O_LARGEFILE|0x80000) = -1 ENOENT (No such file or directory) futex(0x7458a88, FUTEX_WAKE_PRIVATE, 2147483647) = 0 rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 tgkill(30326, 30326, SIGABRT)           = 0 --- SIGABRT (Aborted) @ 0 (0) --- +++ killed by SIGABRT +++ 好像是真的這種白癡錯耶...手動生出這兩個空白檔,開起來了,運作正常... -_-

好用的 rlwrap

上週 曾經為了讓 racket 的互動式介面好用一點,寫了一個小工具,後來又遇到另一個命令列程式有類似的問題( ydict ),所以就想要寫一個通用的版本,希望可以一次解決同樣的麻煩。也就是說,我想用類似下列的指令: $ realineaddon cmd 就讓 cmd 獲得 readline 的功能。 後來寫到一半,遇到幾個問題點,本來要開始翻查 man page ,但念頭一轉,我應該不是第一個想作這件事的人吧?找了一下,果然發現 rlwrap 這個好物,rlwrap 不只有我想要的功能,作者還額外提供了: cmd 可以是 terminal-based program。作者以 pseudo terminal 的方式來傳遞輸入輸出,而不只是單純的 pipe。 支援 filter (須以 Perl 撰寫模組)。讓使用者攔截輸入、輸出...可以為文字介面程式操作帶來更多可能性。 rlwrap 的程式碼可讀性也很高,綜合了創意、實作完成度,實在是小程式的精品啊!:-)

中文試譯:Visualize function calls with Graphviz

作者: M. Tim Jones 原文連結: http://www.ibm.com/developerworks/linux/library/l-graphvis/ 摘要 :你可以花時間在大量的程式碼之間穿梭進而了解function的流程,但當function pointer牽涉其中,並且程式碼非常冗長與糾纏時,這個過程會變得相當困難。本篇文章使用開放原始碼軟體以及一點膠合用的代碼,為你展示如何建立一個動態的function call圖表產生器。 透過圖形化的方式去觀察一個應用程式的呼叫流程是非常具有教育性的經驗。這麼做可以幫助你了解應用程式的內部行為以及獲取對程式進行最佳化的資訊。舉例來說,透過最佳化那些被呼叫最多次的function,你就可以用最少的力氣去得到最大的改進。除此以外,呼叫流程可以識別出使用者的function中最深度的call depth,然後你就可以為stack記憶體作適當的安排使用(在嵌入式系統中,這是一個很重要的考量)。 要獲取並顯示一幅call graph,你需要4個元素:一個GNU toolchain、addr2line程式、一些自定義的膠合代碼、以及一個叫作Graphviz的工具程式。addr2line程式讓你能夠在知道一個執行檔的某個位址後,識別出function名稱以及在源代碼中的行號。自定義的膠合代碼則是一個簡單的工具,可以將位址的追蹤流程轉變成一個圖形的規格。Graphviz則是讓你能夠產生出那些圖形。整個流程如Figure 1所示: Figure 1. 收集追蹤資訊、轉化、並產生圖形的流程 資料收集:追蹤function呼叫 要產生function呼叫的追蹤資訊,你必須知道在程式中的每個function何時被呼叫。在美好的舊時光中,你在每個function的進入點與離開點手動插入可產出獨一無二的符號。這個過程很冗長,令人生厭並且容易出錯,而且還會讓代碼變得混亂。 幸運的是,GNU toolchain(也就是gcc)提供一個為程式自動嵌入自訂function的方式。當被嵌入的程式執行時,profiling程式行為的資料就可以進行收集。你只需提供兩個特殊的此類functions。一個會在被嵌入的function被呼叫時執行;另一個則是當被嵌入的function離開時被呼叫(看Listing 1.)。...

How to generate a call graph of functions in C?

最近看了幾篇關於如何產生C function的call graph的文章,相關手法不少,我將可能有用的resource稍微作點分類整理,這幾天會進行試作: Static: 透過對source code做分析,列出function間的關係。優點:不需更改代碼、簡便、對inline function也有效。缺點:無法顯示執行期資訊,像是執行時間與次數,或recursive function或 function pointer的判斷似乎都不是很準確。 透過cscope產生出來的索引進行分析,然後繪圖,像 這篇 。 利用cflow ,列出程式碼呼叫function的樹狀圖。 Dynamic :優點:沒有static的缺點。缺點:對inline function無效、一般不如static簡便,但都算簡易。 kcachegrind 。利用 valgrind 的基礎設施收集執行期資訊。 gprof2dot 。利用gprof的基礎設施收集執行期資訊。 利用gcc的instrumentation functions。基本運作機制可參考 jserv大俠的介紹 ,實作部份可以參考Aurelian的 proof of concept ,或參考M. Tim Jones這篇整合度更高的 文章 。 利用 gdb script 。可以避免inline function沒有被計算在內,有趣 :-) 。

programmer的daily小工具s (1)

突然發現本blog從開版以來,每篇文章似乎都有點過長,而且一些主題也不一定對每個領域的programmer都有需要...雖然blog就是自己寫爽的,不過有時也希望對路過的人有點直接的幫助,所以我想了一下,整理了幾個目前在用的小工具,有些可能比較不常聽到或使用,不過我覺得蠻優的。可以參考看看: 1. htop 算是top的替代品,不過顯示與操作都讓我覺得爽度倍增,光是彩色的看起來就是HI~ 2. pss pss是一個給programmer使用的grep,可以很方便濾掉不需要grep的檔案,並以較易閱讀的方式呈現出來,詳細用法可以參考 作者的介紹 。另外,推荐該作者 Eli的blog ,那邊可是大寶庫啊~從嵌入式系統、軟體設計慣用法(這是我最愛的)、程式語言(C、C++、Python、Lisp、Ruby、Perl...)、parser、book review、Linker、loader、CPU simulator、virtual machine、GUI...幾乎一個好的系統programmer應該俱備的知識都有涵蓋,而且往往深入淺出,講解的非常精彩,很有個人的想法,在台灣大概只有 Jserv的blog 有這種Fu~或許再來個,programmer的daily blogs?!啊...我好像離題了 :P 3. tmux 算是screen的替代品,不過我覺得比screen更好用,尤其是可以把一個window分成多個panes,對於有寬螢幕的人來講,真是不浪費螢幕的寬度啊~ 4. cloc 可以很方便地統計project的代碼行數,看著自己開發的code base逐漸長大,很有成就感吧?另外,對大的3rd-party project也可以馬上有點感覺,知道它們有多龐大,接下來的日子有多難熬... :) 5. cvslog 如果你跟我一樣不幸,公司到現在還在用CVS,你就知道用CVS有多痛苦...看commit log就是痛苦之一,cvslog是一個Perl script,可以讓這件事簡單一點  6. AWK AWK是一個很簡單又很強大的小語言,可以非常方便地處理格式化的文字檔,這個對於很多人並不稀奇,但不知道為何,我發現一拖拉庫的programmer都不是很熟悉,往往只要寫一點shell sc...