使用IBM rational purify來檢測應用程式記憶體錯誤
記憶體錯誤是除了程式邏輯錯誤之外的另一大類錯誤,影響程式的正常運行,造成程式崩潰異常退出,或是並不發作,形成隱患,在滿足一定條件之後才會發作,一旦發作就會導致程式崩潰或是運行結果出錯。
常見的記憶體錯誤包括:棧記憶體訪問越界(也常叫做數組下標越界、下標溢出)、堆記憶體越界、記憶體泄露、未初始化記憶體、非法記憶體區的訪問等等。
棧記憶體訪問越界和堆記憶體越界,大部分情況下導致運行結果出錯,比較容易發現。
記憶體泄露屬隱蔽性錯誤,不容易被發現。當記憶體泄露過多造成耗竭時,會被發現。
未初始化記憶體往往導致程式Debug編譯沒有問題,一旦Release運行就會出錯。所以說,碰到Debug可以但release出錯的時候,最好不要懷疑是編譯器的問題,往往是代碼有問題,
尋找代碼錯誤也不能在release下查,反而要欲左故右(朋友,看過賽車總動員吧?),在Debug下,藉助boundschecker、IBM Rational Purify等工具,把Debug下出現的記憶體錯誤全部解決,然後再切換到release下編譯,我可以保證90%的可能:問題解決了。
下面我就介紹一下IBM Rational Purify Plus
IBM Rational Purify Plus是IBM rational家族的成員之一,使用專利的“代碼注入”技術,可以針對VC++編譯出的程式,在代碼中注入守護代碼,監控記憶體使用量情況,及時報告記憶體錯誤。
使用很簡單,以VC++6為例,首先以Debug模式編譯你的程式,然後運行Purify,在purify中Run你的程式,Purify就會自動的進行代碼注入,包括程式調用的所有DLL也會被注入守護代碼(這點可是比BoundsChecker強,BoundsChecker僅僅注入當前工程),這樣的話,不僅僅能查出程式本身的問題,它所調用的連結庫的問題也會被查出來(想象一下,如果你的程式架構是一個主程式附帶自己開發的眾多動態庫,用Purify是何等的方便。)。
由於VC++6的Debug版的編譯包含源檔案的檔案路徑、行號等資訊,所以Purify可以準確的把出問題的彙編碼和源檔案對應起來,定位原始碼中的錯誤非常的精準。
對VC++6的Release版來說,Purify對記憶體錯誤的查錯大部分無效,僅僅可以查出對非法記憶體區的訪問,這個Windows本身也可以查到,但Purify的報錯資訊可以指出錯誤原因,甚至可以告訴你是什麼函數導致的,比如告訴你是strcpy導致的,這一點上,比windows宛如天書的錯誤報表要好上很多了,所以還是建議使用Purify。