Blogspot - fcamel-life.blogspot.com - fcamel 技術隨手記

Latest News:

C++ 的 C style cast 不等於 static_cast 27 Aug 2013 | 09:01 pm

即使看了幾次《Effective C++》item 27 "Minimize casting", 還是不明白 C style cast 有什麼重大問題。只覺得新的 cast 比較明確安全, 但寫起來很囉唆, 又是角括號又是括號 (愛惜手指, 請從少按 shift 做起)。一直以為 C style cast 等同於 static_cast, 這樣的話, 在使用 static_cast 的場合, 就偷...

C++ 指標轉型後位置可能會改變 26 Aug 2013 | 10:05 pm

今天踩到一個和 C++ 指標轉型相關的 bug, 幸好以前看《深度探索 C++ 物件模型》時有個模糊的印象, 知道物件指標轉型後, 位置可能會變, 發現這問題後很快就想通了。 先寫個小程式實驗一下: 範例輸出: 由此可得知 a、c、v 位置一樣, 但 b 不同。 若用指標相等做邏輯判斷, 要留意轉型帶來的影響, 特別是中間有轉型成 void* 的時候, 可能傳了同樣的物件, 卻因型別不同造...

以安裝 ccache 為例, 說明如何使用系統工具除錯 24 Aug 2013 | 09:25 pm

ccache 是什麼? ccache 藉由暫存編譯過的 object 檔, 可以減少不必要的重新編譯時間。 用法很簡單: 以我測試的例子來說, 從頭重新編譯一次是半小時左右, 裝了 ccache 後變成一分半。 依 ccache 官網所言, ccache 有可能重編譯不必要的程式, 但不會用到不對的暫存檔, 這也是使用這類工具時最重要的保證。 不過這篇的重點不在 ccache 的用法, ...

用 gdb 略過部份程式碼 24 Aug 2013 | 11:25 am

尋找「誰是兇手」的時候, 以往的作法是註解掉部份程式、重新編譯、重新執行、觀察結果是否有變化。然後反覆前述動作直到找到兇手為止。編譯的時間略長的時候, 這個過程頗為痛苦。 幸好 gdb 有跳掉部份程式碼的方法。其中一個是用 return 結束目前所在的函式, 返回上一層 frame。另一個作法是先設中斷點, 再用 jump 跳到中斷點。 用 return 的小小缺點是: gdb 每次都會問你 ...

有繼承的情況下, C++ method 存取到誰的 member field? 21 Aug 2013 | 11:16 pm

Effective C++ item 27 "盡量少做轉型" 提到下列轉型看起來像對的, 實際是錯的: 對這點感到很納悶, 於是寫個小程式實驗看看。結果發覺自己沒看清楚, 書上舉例是轉型 Window, 不是轉型 Window*, 所以 Window::onResize() 作用到新產生的物件身上, 結果不同於呼叫 Window::onResize()。 既然已經寫了小程式做實驗, 順便記在這...

C++: 使用 private virtual 區分實作介面的 method 21 Aug 2013 | 07:26 pm

問題描述 Java 有語法 interface 明確定義 class 之間的接口, 但是 C++ 沒有, 只能透過「習以為常」的慣例表示, 也就是: class I 宣告一組 public pure virtual function, 表示 I 是一個 "interface" class A 希望實作 I, 於是透過繼承的方式實作 I 需要用 I* 的 class, 取得實作 I 的物件 ...

用 doxygen 產生 class hierarchy diagram 19 Aug 2013 | 07:32 pm

最近需要讀比較複雜 C++ 程式, 常常看到一堆 class 有個祖宗十八代, 要找出眾多子代的 class 或是某個 method 到底是那一代祖先實作的, 有些麻煩。 原本想自己玩看看 clang, 用 clang 分析原始碼產生 graph, 再套 graphviz 畫出來。轉念一想, 這麼常見的需求, 應該有人做好了。況且, 自己處理單檔可能不會麻煩, 但若多個檔案需要不同 includ...

用 python gdb 客製化 backtrace 的結果 (2) 14 Aug 2013 | 09:17 pm

幫之前寫的指令 bt 加上參數 -s, 使用 -s 時, 會一併記錄 backtrace 每個 frame 附近的原始碼。 以下是一個範例輸出: 修改後的 python script 如下: 作法大致和 《用 python gdb 客製化 backtrace 的結果》一樣, 只是改取 fullname, 再自己讀出原始碼相關的內容。這部份用 python 實作, 相當地輕鬆寫意啊~~。

用 macro 組合變動式參數, 強化 log 函式 10 Aug 2013 | 02:39 pm

程式除錯時常需要加些 log 印出變數內容, 通常會希望附帶印出所在的函式。每次要自己重打一次函式名稱太麻煩了, 可以利用 C 的 macro 避免重覆的動作。 先來看個範例程式: 以及輸出結果: 有 #define DEBUG_PRINT 的才會真的執行 DebugPrintf, 除了兼顧原本 printf 有的變動式參數外, 順便自動補上函式名稱和目前物件的指標; 反之則完全不會執行到,...

用 python gdb 客製化 backtrace 的結果 3 Aug 2013 | 07:58 am

需求 想要了解模組之間函式呼叫的關係時, 與其一層層比對多個類別之間的呼叫關係, 不如直接在最後一個呼叫函式放中斷點, 直接顯示 backtrace。但是當函式裡有太多參數或 template 時, backtrace 的 frame 訊息會變得很長, 不易閱讀。我的目的只是找出呼叫的函式名稱、檔名和行數, 函式帶的參數反而是困擾。 作法一: 用 gdb.execute() 一個簡單的作法是...

Related Keywords:

vi 大檔案, css 覆寫, "pycscope" 教學, git vs hg, thread 原理 ubuntu, jquery 上下 改變 數字, redmine github, ramdisk mysql, disable firefox compression gzip;q=0 deflate;q=0, redmine githu b

Recently parsed news:

Recent searches: