1. 程式人生 > >程式碼閱讀工具學習總結

程式碼閱讀工具學習總結

程式碼閱讀工具:Source Navigator和Source Insight



一、Source Insight實用技巧:
Source Insight(下文的SI指的也是它)就是這樣的一個東西:
  Windows下開發人員的至愛,功能強大,介面友好。支援語法高亮、符號跳轉,還支援函式呼叫關係


圖顯示。這是一個專業的程式設計環境,很多大公司都是使用它的。這個編輯器除支援完善的自定義功能外


,幾乎所有配置都能作個性化配置。除此之外,它本身帶有一套功能強大的巨集語言(Macro Language),


藉助這種語言可以很方便的程式設計實現各種特殊功能,非一般編輯器所能比擬。查詢功能支援得也很不錯


。雖然在工程較大時,查詢起來有點慢。但是它除了一般編輯器所支援的普通字串查詢、正則表示式


查詢外,還能支援關鍵字查詢-這種方式比前兩者快得多,也算是一個彌補。不足之處是列模式較弱,對


中文支援有缺陷。


顯然,它也像其它任何東西一樣的,同時具有優點和缺點的本性的,究竟如何,且聽我一一道來。


官網下載:http://www.sourceinsight.com/down35.html


序列號(Serial):(任選其一)
SI3US-279028-11281
SI3US-772862-51931
SI3US-465643-84290
SI3US-176526-66007
SI3US-060062-28251


1  開胃菜-初級應用


1.1  選擇美麗的介面享受工作


雖然不能以貌取人,但似乎從來沒有人責備以貌取軟體的。SI的華麗介面,絕對符合現代花花世界的人


的審美趣味。在SI中,我們可以輕鬆地把各種型別關鍵字、變數、標誌符、函式、巨集、註釋等定義為不


同的顏色和顯示方式(正體或斜體、加粗或正常、加下劃線、放大顯示等),總有一種方式能讓我們一眼


就能分辨出這個標識是什麼。


1.1.1  字型選擇


在SI中樣式是可以被繼承,如果要從根本上改變字型,最簡單的方式就是直接修改根樣式中的字型,因


為其它樣式都會由此繼承而來。選擇Options/Document Options頁面內的Font Options中的Screen 


Fonts字型,即可改變根樣式中的字型。SI中的預設配置為Verdana字型,是一種非等寬字型 2 ,為了使


編寫的程式碼在各種編輯器中看起來都有良好的對齊效果,這裡強烈建議使用等寬字型,Courier、New 


Courier和宋體等都是較好的選擇。


1.1.2  顏色定義


畢竟這是見仁見智的東西,所以從來沒有統一的標準3。很多人並不喜歡SI提供的預設配置,那麼我們就


改吧。選擇Options/Style Properties頁面,就可以在其中修改所有樣式了。選擇等號(=)表示繼承


Parent Style,也可以選擇Pick(或者ON/OFF等)去配置一個新值。這完全視乎個人喜好。


1.1.3  識別符號樣式選擇


在與 顏色定義 一節同樣的介面內即可完成此項配置。


1.1.4  背景色選擇


在希望要改變背景色的視窗點選滑鼠右鍵(假定使用的是右手滑鼠 4),選擇上下文選單的 xxx Window 


Properties項,然後點選彈出視窗的Back Color按鈕,即可修改該視窗背景色。對於SI的原始碼主視窗,


只需選擇上下文選單的Special Window Color項即可完成背景色修改。


1.2  配置合理的預設值高效工作


1.2.1  使用合理的縮排


我始終認為最容易獲得認同的是關於這個選項的配置了。選擇Options/Document Options頁面,點選其


內的Auto Indent按鈕,在彈出的Auto Indenting視窗中,預設配置為 Auto Indent Type選擇Smart,且


勾選了Smart Indent Options中的兩個可選項,這樣得到的預設縮排效果為


    while (1)
        {
        I
        }


每次都要手工去調整其縮排,其實只要把兩個勾選項去掉,就可以得到


    while (1)
    {
        I
    }


何樂而不為呢?


1.2.2  顯示座標


通常情況下在視窗狀態列左下方,最會顯示當前游標所在行列資訊,但我總覺得不夠明顯,於是通常我


們作如下配置:


選擇Options/Document Options頁面,勾選其中的Show line numbers。同時勾選其中的Show right 


margin,我們就可顯示一條右邊界,隨時提醒我們是否該行程式碼寫得過長了。


1.3  建立便捷的快捷鍵快樂工作


1.3.1  幾個較常用的快捷鍵


預設情況下,SI已經定義了很多非常實用的快捷鍵:


F5
指定行號,實現行跳轉,在遇到編譯錯誤的時候,能特別方便的找到出錯行。
Shift+F8
高亮顯示指定標識,快速瀏覽標識的使用情況。
Ctrl+滑鼠點選標識
直接跳轉至標識定義處。
Ctrl+F
本檔案內查詢。
F3
本檔案查詢結果的上一個。
F4
本檔案查詢結果的下一個。
F7
開啟Browse Project Symbols視窗,快速瀏覽工程內標識定義。
Ctrl+M
建立或查詢書籤,方便下次找回此位置。
1.3.2  自定義快捷健


選擇Options/Key Assignments,在彈出的Key Assignments視窗中可自由新增自己喜歡的快捷鍵。比較


值得推薦的有如下幾個快捷鍵定義:


Edit: Drag Line Down
游標當前行下移。
Edit: Drag Line Up
游標當前行下移。
Edit: Join Lines
當前行和下一行連線成一行。
1.3.3  更多的快捷鍵


如果你正好對SI的Marco語言(下文將會介紹)有研究,那麼還可以定義更多有用的快捷鍵,比如新增檔案


頭、函式頭、註釋等(下文在介紹Marco語言時會介紹如何實現)。


2  小技巧-中級應用


2.1  查詢與替換


在SI中支援多種查詢及替換方式,除了上文提到的檔案內查詢外,還支援工程範圍內查詢、目錄查詢、


指定多檔案查詢等等。


2.1.1  查詢


Loopup References


我們最常用的一種查詢方式是選擇Search/Lookup References或按Ctrl+/組合鍵再或者滑鼠點  R 按鈕


,在彈出的Loopup References視窗進行查詢操作。


在Search Method中有四種可選的查詢方式:Simple String、Regular Expression、 Keyword 


Expression和Look Up Reference。其中Simple String是最普通的查詢方式,可以查詢檔案中出現的任


意字元或字元,甚至可以查詢 _upap || u 這樣的字串,但是在工程較大時,查詢過程會較慢。


Regular Expression查詢方式將在後面講述正則表達時會介紹到,這裡暫時按下不表。


Keyword Expression和Look Up Reference查詢的結果基本相同,但是顯示方式略有差異。這兩種方式都


是使用SI預先建立的資料庫,查詢起來速度相當快。但通常這種速度只對在查詢識別符號時有明顯效果。


對於像函式名,變數名等的查詢,強烈建議使用這兩種方式進行查詢。


Search Files
選擇Search/Search Files或按Ctrl+Shift+F組合鍵,在彈出的Search Files視窗進行查詢操作。
在File Name框中可以填入檔名或資料夾。注意當要查詢的資料夾雙包含子資料夾時,可以勾選


Options中的Include Subdirectiories,實現對各層檔案的遞迴搜尋。
Search Project
選擇Search/Search Project,在彈出的Search Project視窗進行查詢操作。操作與Loopup References


幾乎完全一致,它們各自儲存上次搜尋的配置。
2.1.2  替換


單檔案替換
選擇Search/Replace或按Ctrl+H組合鍵,在彈出的Replace視窗進行查詢操作。在Search專案裡勾選


Selection則僅對當前選中的文件部分進行替換。另外如果勾選了Confirm Replacements則是逐個確認替


換,否則會同時替換所有符合替換條件內容。
多檔案替換
選擇Search/Replace Files或按Ctrl+Shift+H組合鍵,在彈出的Replace Files 視窗進行查詢操作。除


了增加New框(替換後的內容)外,其餘均與Search Files視窗相同,可參照查詢部分的說明進行操作。
2.2  列操作


雖然開篇時就說過,SI的列操作功能比較弱,但不等於沒有。先按下Alt鍵,接著就可用滑鼠進行列選擇


,然後就可以刪除指定的列。


2.3  無名技巧


這裡介紹一些小技巧,大多數情況下我們可以無視它們的存在。但如果我們知道這些,某些時候,會有


效提高工作效率。


Smart Rename
在上下檔案選單中選Smart Rename或按Ctrl+'組合鍵,即可彈出Smart Rename視窗。它有很強大的功能


,但最便捷的使用方式是更改函式內區域性變數的名字,操作只作用於函式內部,速度非常快。
Renumber
使用Ctrl+R將彈出Renumber視窗,這個用於處理數字順序排列的情況相當有效,比如陣列下標。例如現


有程式碼
    array[0] = 1;
    array[1] = 2;
    array[2] = 3;


現在要改為
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
    array[3] = 3;


當然可以一個個修改,但最快的方式是在array[0] = 1;之前新增array[0] = 0;,然後列選陣列下標,


使用Renumber功能以 0為起始值重填數值。
Edit Condition
很多程式碼尤其是驅動程式碼,當中有大量的預編譯定義,以實現對不同硬體配置的支援。在閱讀這樣的代


碼時最痛苦的是不能簡單判斷程式實際執行的程式碼分枝。大量分枝同時存在,常常會混淆我們的視聽。


比如對於下面的程式碼:
    #ifdef DEV1
        /* DEV1程式碼程式碼 */
    #else
        /* 其它裝置執行程式碼 */
    #endif


如果確定我們當前分析的是DEV1的執行情況 5,那麼可以選擇上下檔案選單的Edit Condition 選項,在


彈出的Conditional Parsing視窗中把DEV1的值設定為True,那麼 #ifdef DEV1就等價於#if 1了,相當


註釋掉了#else分枝的程式碼。反之,設定為Flase時,則註釋掉#ifdef DEV1分枝的程式碼。
3  學會偷懶-高階應用


4  附錄1-SI中正則表示式


由於在查詢及替換中,經常會使用用正則表示式6,這裡對SI的正則表示式進行簡單介紹。


4.1  萬用字元


正則表示式萬用字元總表:
CharacterMatches
^ (在表示式開始處)行的開始部分
.任意單個字元
[abc]任意屬於集合 abc 的單個字元
[^abc]任意不屬於集合 abc 的單個字元
*前面字元的0個或多個重複
+前面字元的1個或多個重複
\t一個 tab 字元
\s一個空格符
\w一個空白符(包括 tab 符和空格符)
$行的結束部分
4.2  表示式中的組


在執行替換操作時,組將大有用武之地。正則表示式的各個部分可以用\(和\)進行分隔,分隔得到的每


一項就是一個組。在進行替換時可通過組從匹配內容中抽取出特定串。在正則表示式中每個組都有一個


編號,自左至右編號從1開始。


例如:abc\(xyx\)將能匹配 abcxyz ,此時組1就包含了 xyz 串。在進行替換操作時,就可以通過在替


換後內容框中填入\1來取出這個字串。推而廣之,可以使用\<number>來取得組<number>所包含的串。


例如:當設定把\(abc\)\(xyz\)替換為\2\1的替換規則時,對於 abcxyz 被替換串,則組1包含 abc,組


2包含 xyz,而替換後的內容定義為組2內容後跟組1內容(\2\1),因此將得到 xyzabc。


    舉個真實的使用例子,相信會增加大家的興趣。有時為方便除錯,程式碼中到處流浪著各種形式的


mytrace呼叫


    mytrace("Create parameter list... ");


 有時希望把它們全部註釋掉,而有些時候又希望把它們全部恢復回來。這是個簡單的例子,可以使用


    ^\(.*\)\(/\*\)\(.*mytrace.*\)\(\*/\)___FCKpd___6nbsp;==> \1\3


把它們恢復回來,而使用


    ^\(.*\)\(mytrace\)\(.*\)___FCKpd___7nbsp;==> \1/*\2\3*/


則完成把它們全部註釋掉。


5  附錄2-SI中的巨集語言


我始終認為這是SI中最有趣的部分,這是一種功能強大的程式語言,幾乎可以實現在程式設計過程可能使用


到的各種功能。 這裡不準備對如何實用巨集語言進行程式設計作介紹(可參閱SI幫助文件。),只介紹如何使用


已編好程式。為方便使用,我已把這些程式都集中放在utils.em檔案中,下文就此檔案進行論述。


該巨集檔案實現了一些在編碼過程中可能會用到的功能, 如新增檔案頭、函式說明(使用時能自動新增檔案


名、函式名和當前日期)和巨集定義,程式碼補全等。 使用說明:


(1) Project/Open Project...
開啟Base工程(該工程一般在"我的文件/Source Insight/Projects/Base"中);


(2) Project/Add and Remove Project Files...
加入巨集檔案(即utils.em);


(3) Options/Menu Assignments
開啟Menu Assignments視窗,在Command中輸入Macro,選中要使用的巨集,新增到合適的選單中.


推薦使用的巨集:InsFileHeader、InsFunHeader、InsHeaderDef、InsIfdef和AutoExpand (為程式碼自動補


全功能,建議建快捷鍵)。


關於AutoExpand的舉例說明, 當你輸入了 switch 且游標正處於switch後面,執行該巨集則會得到


    switch (###)
    {
    case
        break;
    default:
    }
對於InsFunHeader巨集,如果有如下函式體


    int nOpenConfigFile(char *pchMemConfig, char *pchFlashConfig,
        int nSize, int nMode)
    {
        I
    }




游標在函式體內時執行該巨集,那麼將會在函式體上方得到


/******************************************************************************
 * nOpenConfigFile -
 * DESCRIPTION:-
 *
 * Input:   N/A
 * Output:  N/A
 * Returns: N/A
 *
 * modification history
 * --------------------
 * 1.00, Apr 19, 2007, T357 written.
 * --------------------
 ******************************************************************************/




其中的函式名及編寫日期自動按實際情況填充,T357串可通過修改utils.em檔案,改成你需要的名字。


6  附錄3-推薦格式


7  結束


至此,已將我所知的所有關於Source Insight(未包括其附帶的Macro語言)知識在此文件中描述出來。


二、原始碼檢視工具 Source Navigator 使用心得
Source Navigator 是Red Hat出品的一款檢視原始碼的工具,非常好用,與Windows下的Source Insight


有一敵。但是它的介面不怎麼好看,用的不是GTK圖形庫,所以介面風格與Gnome不一致,操作上也有些


不同。除了這些,其它功能都非常強大,細數如下。裡面的一些簡寫約定如下:


Code Area


clClasses
conConstants
eEnums
ecEnum Values
fdFunction Declarations
frfriends
fuFunctions
gvGlobal Variables
ivInstance Variables
maMacros
mdMethod Definitions
miMethod Implementations
tTypedefs
unUnions
lvLocal variables
udUndefined


Cross-Reference


rRead
wWritten
pPassed
uUnused
SNav的程式碼視窗有6個標籤頁,它們分別是
“Edit”
“Hierarchy”
“Class”
“Xref”
“Retriever”
“Grep”其中,“Edit”區是程式碼顯示和修改的區域,是工作的主要區域;“Hierarchy”和“Class”


是C++程式碼的組織工具;“Xref”是最強大的一個工具,它會把一個函式中的所有用到的變數,呼叫的函


數,用到的結構全記錄並展現出來;“Retriever”也是一個非常有用的工具,用於把一個庫程式碼包中的


所有定義的符號列出來,並記錄相應的屬性;“Grep”用於查詢某一個符號,可指定搜尋的範圍,既可


全域性查詢也可部分檔案查詢。閱讀程式碼時常用到的一些鍵值組合:
Ctrl+leftarrow | rightarrow | uparrow | downarrow 以詞的形式移動游標
Ctrl+Alt+leftarrow | rightarrow | uparrow | downarrow 以詞的形式移動游標並選擇走過的區域
Ctrl+Shift+D 檢視選定符號的宣告
Ctrl+Shift+I 檢視選定符號的定義程式碼視窗的工具欄上有7個元素,分別是
“回退跳轉”
“前進跳轉”
“游標處所在的函式名或結構名”
“選定並要操作(比如查詢)的字串”
“在本檔案中查詢選定的字串”(比Ctrl+F查詢功能好使)
“在整個工程中查詢與選定字串匹配的程式碼”
“在整個工程中以Grep的方式查詢與選定字串匹配的程式碼”(會跳到Grep標籤頁中顯示結果)注意:


snavigator在匯入目錄時,目錄名中間不能出現空格。


三、在ubuntu中安裝 Source-Navigator及使用手冊 
2009-09-25 23:19 
from : http://hi.baidu.com/xiaohu_tiger/blog/item/66d207888431d6b40f2444ec.html


1 通過apt-get安裝(版本較舊) 
安裝命令:sudo apt-get install sourcenav 
啟動命令:snavigator


2 手動安裝最新版本 
1)到官方網站獲取軟體包 
http://sourceforge.net/project/showfiles.php?group_id=51180 
2)解壓縮 
tar zxvf s ourcenav-6.0.tar.gz 
./configure --prefix=/opt/sourcenav (install 檔案推薦引數) 
make 
make install 
ps:如果出現許可權問題,前面加sudo 
3)如果碰到下述錯誤 
/root/tk8.4.16/unix/../generic/tk3d.c:1279: error: ‘TkBorder’ has no member named 


‘resourceRefCount’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘Tk_FakeWin’ has no member named 


‘display’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘Tk_FakeWin’ has no member named 


‘screenNum’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘TkBorder’ has no member named 


‘screen’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1281: error: ‘Tk_FakeWin’ has no member named 


‘atts’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1281: error: ‘TkBorder’ has no member named 


‘colormap’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1301: error: ‘TkDisplay’ has no member named 


‘borderTable’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1301: error: ‘TkDisplay’ has no member named 


‘borderTable’ 
/root/tk8.4.16/unix/../generic/tk3d.c:1306: error: ‘TkBorder’ has no member named 


‘nextPtr’ 
。。。。。。 
則在終端是輸入:sudo apt-get install libx11-dev 
4) 啟動snavigator 
在終端直接輸入:snavigator 
5) 使用手冊(user manual) 
http://sourcenav.sourceforge.net/online-docs/userguide/index_ug.html 
還有一個 source insight 和source navigator的比較的帖子: 
http://fky168.blog.163.com/blog/static/3786097200831033957620/


======================================================== 
執行source navigator的問題 
方法一、(轉載) 
安裝完成後執行 snavigator 提示 
[
[email protected]
sourcenav-6.0]# snavigator 
Can't find a usable tk.tcl in the following directories: 
/usr/local/share/tk8.3


/usr/local/share/tk8.3/tk.tcl: no event type or button # or keysym 
no event type or button # or keysym 
while executing 
"bind Listbox <MouseWheel> { 
%W yview scroll [expr {- (%D / 120) * 4}] units 
}" 
(file "/usr/local/share/tk8.3/listbox.tcl" line 182) 
invoked from within 
"source [file join $tk_library listbox.tcl]" 
invoked from within 
"if {[string compare $tcl_platform(platform) "macintosh"] && \ 
[string compare {} $tk_library]} { 
source [file join $tk_library button.tcl] 
so..." 
(file "/usr/local/share/tk8.3/tk.tcl" line 30 
invoked from within 
"source /usr/local/share/tk8.3/tk.tcl" 
("uplevel" body line 1) 
invoked from within 
"uplevel \#0 [list source $file]"




This probably means that tk wasn't installed properly.


不知其所以然,重新安裝tk8.3無效,升級到tk8.5無效


後來在網上發現需要給下載的Source-Navigator 6.0打補丁 
到http://bugs.gentoo.org/show_bug.cgi?id=225999 找到 tk-8.4-lastevent.patch 補丁 
將補丁貼上到source navigator 原始碼目錄 sourcenav-6.0/tk目錄下,再cd 到sourcenav-6.0/ tk 的源


碼目錄 
patch -p0 -i tk-8.4-lastevent.patch 
刪除安裝,重新安裝,可以運行了(我試了一下不行)。


方法二、(轉載) 
有找到解法: 
(http://forums.fedoraforum.org/showthread.php?t=213441) 
註掉 lines 182-184 in the file /opt/sourcenav/share/tk8.3/listbox.tcl 
註掉 lines 457-459 in the file /opt/sourcenav/share/tk8.3/text.tcl


在panel中新增Launcher,在Command中新增/opt/sourcenav/bin/snavigator


====== 安裝完後在桌面增加捷徑的方法 ====== 
我要做捷徑的目標是/opt/sourcenav/bin/snavigator (這是個sh script) 
裡面要改一行 
#snbindir=`dirname $0` 
snbindir=/opt/sourcenav/bin 
這樣再建一個捷徑到桌面即可: 
ln -s /opt/sourcenav/bin/snavigator ~/Desktop/


本文來自CSDN部落格,
http://blog.csdn.net/dian_technology/archive/2010/07/23/5757884.aspx


========


程式碼分析工具推薦Understand

之前看ogitor ,第一次看到那麼多程式碼~~不知道從哪裡下手,而且好多東西都不會Ogre什麼的都不是很


清楚,對ogitor的程式碼結構的瞭解就更不用提了。暈頭轉向的不知道從哪裡下手,一點點的看起來好吃


力。後來從部落格中看到了說understand的 ,當時用了一下可以從原始碼生成類圖 感覺很不錯。不過由


於考試啊亂七八糟的原因放了一段時間之後又由於系統出了問題重灌後把他弄丟了,今天想用結果怎麼


也找不到是什麼,連名字都忘了  汗~~以後要及時記錄啊  找了幾乎一天終於又找回來了 呵呵感覺比


rational rose好得多吧,rational rose 現在已經沒有更新了 下了一個都感覺不好用 win7下直接打不


開 糾結  這個understan 的ui使用qt開發的呢 呵呵


下載網址是http://www.scitools.com/


Understand


                ---- 原始碼分析&度量


Understand™ 從度量、圖表、依賴關係分析、程式碼檢查、等各方面全面管理您的原始碼。


Understand_screen_shot


Understand™主要特點


 Understand度量


Understand™對所分析的程式碼進行高效的度量計算,其計算也可通過命令列自動執行,同時支援表格匯出


、圖形顯示以及GUI動態瀏覽;另外,更可以通過Understand Perl API進行度量的自定義。通過


Understand,還可以產生專案級(包含檔案、類、函式或系統架構)的報告。


 程式碼檢查


Understand檢查您的程式碼是否符合程式碼的國際標準(如MISRA-C 2004,MISRA-C++ 2008等),或者您自


己自定義的檢查標準,如企業的程式碼規範等。


 程式碼編輯器


Understand提供了可以維護和理解您的程式碼的編輯器,通過其瀏覽、對比(檔案/目錄對比,‘微’對比 


– 如字元級對比)您的原始碼,可以更容易、更高效的進行程式碼的編輯;同時,該編輯器還支援自定義


的設定,滿足開發人員的工作需要。


 依賴關係分析


Understand依賴關係瀏覽器具備以下特點:


- 檔案及結構依賴關係快速瀏覽


- 依賴/被依賴關係、Butterfly圖(檔案/架構)


- 依賴關係圖表匯出


- 最新設計的依賴關係瀏覽Dock顯示所以的依賴資訊


Understand可以生成各種依賴關係圖表(如整體架構的繼承關係、子系統的繼承關係等),


其結果可以儲存為PNG、JPEG、SVG等,更可以直接儲存為VISIO檔案。


Understand依賴關係資訊可以匯出為CSV檔案以備您進行進一步的分析。


 即時搜尋


通過Understand的即時搜尋能力,您可以在上百萬行的程式碼中立刻找到您需要的資訊。


 多種圖表


Understand支援各種圖表的生成,所有的圖表您都可以將其儲存成圖片格式作為更廣泛的編輯用途。通


過Understand,您可以生成下列圖表:


- 宣告關係圖


- 繼承關係圖


- 控制流圖


- 依賴關係圖


- UML類圖


- 樹形關係圖


- 自定義圖表


 程式碼資訊


- 通過Understand的資訊瀏覽器,你可以看到相關程式碼實體所有詳細資訊。


- 程式碼上下文資訊顯示


- 自動化:通過Understand提供的相應命令,您可以快速的建立、分析專案和產生報


告,同時可以將Understand與您的構建系統進行整合,自動完成所以程式碼的分析。


 報告


Understand支援各種報告的生成,根據您專案的開發語言,基本可以生成如下幾類報告:


- 交叉引用報告


- 架構分析報告


- 質量報告


- 度量報告


- 客戶自定義報告




 支援的語言


Understand支援:Ada, C/C++, C#, FORTRAN, Java, JOVIAL, Pascal, PL/M, VHDL, Cobol, Web 


Languages (如PHP, HTML, CSS, Javascript和XML等)。


即使您的專案同時包含多種語言,Understand也可以進行分析。


 支援的作業系統


Understand支援:Microsoft Windows (32位、64位),Linux (32位、64位),Solaris Sparc,Solaris 


X86,Mac OSX。


引用自http://www.emenda.eu/index.php?


option=com_content&view=article&id=44&Itemid=22&lang=zh
 
========


強大的程式碼閱讀工具Understand


個附件_http://www.scitools.com/products/understand/


Understand軟體的功能主要定位於程式碼的閱讀理解。介面貌似是用Qt開發的。


具備如下特性:
1、支援多語言:Ada, 
C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合語言的project也支援
2、多平臺: 
Windows/Linux/Solaris/HP-UX/IRIX/MAC OS 
X
3、程式碼語法高亮、程式碼摺疊、交叉跳轉、書籤等基本閱讀功能。
4、可以對整個project的architecture、metrics進行分析並輸出報表。
5、可以對程式碼生成多種圖(butterfly 
graph、call graph、called by graph、control flow graph、UML class 
graph等),在圖上點選節點可以跳轉到對應的原始碼位置。
6、提供Perl 
API便於擴充套件。作圖全部是用Perl外掛實現的,直接讀取分析好的資料庫作圖。
7、內建的目錄和檔案比較器。
8、支援project的snapshot,並能和自家的TrackBack整合便於監視project的變化。


小技巧(官網的FAQ裡有):


1、設定字型和顏色風格


修改預設字型:Tools 
-> Options -> Editor -> Default style
修改顏色: Tools -> Options 
-> Editor -> 
Styles


2、生成UML類圖、呼叫樹圖


預設安裝的外掛不支援這兩種圖,需要從官網下載外掛。
_http://www.scitools.com/perl_scripts/uperl/uml_class.upl
_http://www.scitools.com/perl_scripts/uperl/invocation.upl
放到sti/conf/scripts/local目錄下。
然後重新執行,執行 
project-> project graphical views -> 
xxxx可以生成這兩種圖。


3、更改圖的字型


直接修改對應的指令碼檔案(\Program 
Files\STI\conf\scripts目錄下),在do_load( 
)函式的對應位置加入如下的設定:


$graph->default("fontname","Consolas","node");
$graph->default("fontsize","10","node");
$graph->default("fontname","Consolas","edge");
$graph->default("fontsize","10","edge");


注意:有的指令碼中的作圖變數名不是 
$graph 而是 $g。


另外一款程式碼視覺化理解工具: http://www.sgvsarc.com/prod_crystalrevs_screenshots.htm


========


Source Insight 生成函式呼叫關係圖

  做資料結構作業,其中有要交一個演算法的函式呼叫關係圖。這個課堂上也沒講過。懶人自然不會用


word或者mspaint一點一點去畫了。而visio這種東西,用著也挺麻煩。


  於是上網百度了一下,查到一個叫Source Insight的軟體,這個可以根據程式碼自動生成函式呼叫關


系圖。這裡把最基本的使用方法介紹一下。在使用之前要先在Options-Preference裡設定一下語言)


  1、程式主介面(不會排版,圖片傳上來竟然這麼大)


2、匯入原始碼檔案


File-Load File,選擇你要用的檔案


3、生成呼叫關係圖


開啟檔案後,將游標置於對應函式上,在Relation Window中就會顯示對應的函式關係調用圖。


========


Source Insight函式呼叫關係顯示設定



當我們需要設定source Insight的專案程式碼中函式呼叫關係時,可通過如下的設定來實現:
1、顯示函式呼叫關係視窗
  Source Insight工具欄中“View”—>“Relation Window”,選中“Relation Window”則在右下角顯


示一個函式呼叫關係視窗,如圖:


上圖表示ServiceMain函式呼叫了其他函式,例如呼叫了ServiceDelete函式等。
2、設定顯示風格
如果希望顯示ServiceMain被誰呼叫了,這可通過如下步驟設定:
點選下圖紅色框住的圖示


將彈出如下視窗後,修改下圖紅色框中的內容為Referenced by Functions,系統預設的是Calls。設定


好後,然後點選ok按鈕儲存設定。


點選下圖紅色框住的重新整理按鈕


則顯示如下圖內容:


該圖表示ServiceMain函式被main函式在15048和15056行呼叫了。
設定完畢。
========

給Source Insight做個外掛之一--發現Source Insight



    一提到外掛程式,大家肯定都不陌生,QQ就有很多個版本的去廣告外掛,很多遊戲也有用於擴充套件功


能或者作弊的工具,其中很多也是以外掛的形式提供的。外掛和外掛的區別在於外掛通常依賴於程式的


支援,如果程式不支援外掛機制,那麼就無法為其開發外掛,而外掛則不然,它不依賴於程式本身的功


能,通常是一個單獨執行的程式,“掛”其它程式的方法就是跨程序程式碼注入。如果這個世界的所有軟


件都是開放原始碼的,而且沒有那麼多的License限制,黑客們可以自由修改程式碼釋出新功能,那麼就不


會出現外掛這東西。給別的程式做外掛是一件很麻煩的事情,並不是所有的程式都能夠“容忍”從外部


注入的程式碼,特別是一些程式存在內部缺陷,按照正常的Windows執行機制注入的功能通常不能達到預期


的效果,甚至是造成該程式不能使用,所以如果不是實在沒有別的辦法的話,沒有人會主動使用做外掛


的方式一個程式擴充套件功能。
    
    儘管不願意,但還是有一些程式只能通過外掛來擴充套件它的功能,本文提到的這個“不得不掛”的程


序就是大名鼎鼎的原始碼瀏覽工具:Source Insight。Source Insight是一款....[此處省略介紹性文字


字元數(不計空格)1028,非中文單詞126,中文字元或朝鮮語單詞819]。我使用VC很長時間,也許是被


VC的“Tabbar”外掛慣壞了,所以當我使用不能通過檔案標籤切換檔案的編輯器的時候就感覺非常不適


應,很不幸,“Source Insight”就是這樣的。使用了“Source Insight”一段時間之後,我開始尋求


為其新增一個檔案標籤欄的方法,“Source Insight”功能強大,可以通過自定義命令擴充套件它的功能,


甚至支援一種類似於C語言語法的巨集語言,但是經過一段時間的研究之後,我得結論是隻能通過外掛對“


Source Insight”的介面進行擴充套件,新增一個用於檔案切換的標籤欄。
    前面已經提到,不是所有的程式都能夠“容忍”外部注入的程式碼,我之所以覺得“Source Insight


”可以掛一下,是因為“Source Insight”使用的是標準的Windows MDI(多文件介面)視窗,視窗之前


的訊息流向簡單且遵循Windows標準機制。於是一個月以後,“Source Insight”的檔案標籤外掛:


TabSiPlus就誕生了,在研究“Source Insight”和編寫“TabSiPlus”期間積累了一些經驗,留在自己


的腦子中只會慢慢遺忘,現在把它們整理成文字和大家一起共享。
    首先介紹一下“TabSiPlus”,它的主要功能就是給“Source Insight”新增一個檔案切換標籤欄,


這個切換標籤欄對於使用“Source Insight”編寫程式碼的人有很大的幫助,先看一些它都給“Source 


Insight”帶來了哪些變化:


程式碼視窗下面多了一個檔案標籤欄,選單也變樣了,還加上了幾個圖示,其實選單的底色和文字顏色都


是可以改變的,檔案標籤欄的顏色也是可以改變的,看看:


除此之外,還添加了C/C++檔案翻轉的功能,這個可是VA的常用功能,相信大家都不陌生,這個C/C++文


件翻轉功能繼承了“Tabbar for Visual C++”外掛的多目錄、多副檔名搜尋功能:


    從現在開始,我就通過一系列文章介紹“TabSiPlus”是怎樣一步一步的做出來的,也包括


對“Source Insight”的研究過程,本篇主要介紹如何找到“Source Insight”。這是一個很重要的問


題,如果不能從系統中找到正在執行的“Source Insight”,那麼外掛就無從掛起了。查詢系統中執行


的“Source Insight”程式有很多種方法,可以遍歷系統中的所有程序,然後看看有沒有insight3.exe


,並得到這個程序的控制代碼;也可以通過視窗列舉,找到有“Source Insight”標誌的主視窗,並獲得這


個主視窗的控制代碼。當然還有其他的方法,這裡就不一一介紹了,“TabSiPlus”採用視窗列舉的方法,因


為“Source Insight”的主視窗的類名是固定的且標題欄文字很有規律,在任何情況下都有“Source 


Insight”字樣,便於匹配,其實主要的原因是視窗列舉方法簡單。
    使用Spy++工具研究“Source Insight”的主視窗,發現其視窗的類名是“si_Frame”,這是一個好


兆頭,如果一個視窗的類名是類似於“Afx:400000:0:10011:10:0”就麻煩了,這是MFC主框架視窗類的


典型名字,裡面的那些數字是諸如程序地址,視窗圖示控制代碼,滑鼠游標控制代碼格式化成的一個字串,它


是可變的,在某個系統上是一個結果,在另一個系統上可能是另一個結果。再來看看“Source Insight


”主視窗的標題文字,發現無論什麼情況都包含一個“Source Insight”子串,這對於我們確定這個窗


口是否是“Source Insight”主視窗可以起到一個輔助判斷的作用。列舉視窗使用EnumWindows() API,


這個API使用一個回撥函式,以下是回撥函式的原型:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
下面是“TabSiPlus”中EnumWindowsProc()回撥函式的實現:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
 BOOL bSuccess = TRUE;
 if(hwnd != NULL && IsSourceInsightFrameWnd(hwnd))
 {
  if(lParam)
  {
   HWND *pHwnd = (HWND *)lParam;
   *pHwnd = hwnd;
   bSuccess = FALSE;//已經找到一個Source Insight視窗,退出列舉
  }
 }
 return bSuccess;
}
這個函式利用lParam引數將視窗控制代碼傳遞出來,它一次只處理一個“Source Insight”視窗,如果系統


中有多個“Source Insight”執行,就會有多個“Source Insight”主視窗,這由外部機制驅動列舉函


數進行多次列舉,保證對所有的“Source Insight”進行處理。你可能已經看出來這樣存在重複發現的


問題了,是的,存在這樣的問題,不過“TabSiPlus”採用一個巧妙的方法解決了這個問


題。“TabSiPlus”在Hook一個“Source Insight”視窗之後就在視窗標題欄新增一個“ with 


TabSiPlus”的標誌,這樣就可以區分視窗是否已經處理過了。下面就是判斷一個視窗是否是“Source 


Insight”視窗的IsSourceInsightFrameWnd()函式:
LPCTSTR lpszSourceInsight = _T("Source Insight");
LPCTSTR lpszSiFrameWndClass = _T("si_Frame");
LPCTSTR lpszTextMark = _T(" with TabSiPlus");
BOOL IsSourceInsightFrameWnd(HWND hWnd)
{
 TCHAR szClassName[128],szTitle[256];
 
 int nRtn = GetClassName(hWnd,szClassName,128);
 if(nRtn == 0)
  return FALSE;
 nRtn = GetWindowText(hWnd,szTitle,256);
 if(nRtn == 0)
  return FALSE;
 //類名是si_Frame,並且視窗標題又含有Source  Insight,可以基本判定是一個Source Insignt視窗
 if((lstrcmp(lpszSiFrameWndClass,szClassName) == 0) && (StrStr(szTitle,lpszSourceInsight) 


!= NULL))
 {
  if(StrStr(szTitle,lpszTextMark) != NULL)//有這個mark說明已經Hook過了,不要再騷擾source 


insignt視窗了
   return FALSE;
  return TRUE;
 }
 return FALSE;
}
    下面是找到一個“Source  Insight”視窗的排程函式,每次呼叫一次排程函式可以查詢到一個沒有


被Hook過的“Source  Insight”:
HWND FindSourceInsightFrameWindow()
{
 HWND hSiFrmWnd = NULL;
 
 BOOL bRtn = ::EnumWindows(EnumWindowsProc,(LPARAM)&hSiFrmWnd);
 if(!bRtn && hSiFrmWnd != NULL)
  return hSiFrmWnd;
 else
  return NULL;
}
    最後是查詢“Source  Insight”視窗並將指定的動態連線庫掛到“Source  Insight”程序中的函


數:
//一次試圖查詢並Hook一個Source Insighe視窗
BOOL FindAndHookSourceInsightWindow(LPCTSTR lpszHookDll)
{
 BOOL bSuccess = FALSE;
 if(lpszHookDll)
 {
  HWND hSiFrmWnd = FindSourceInsightFrameWindow();
  if(hSiFrmWnd != NULL)
  {
   bSuccess = HookSourceInsightWindow(hSiFrmWnd,lpszHookDll);
  }
 }
 return bSuccess;
}
這個函式中呼叫了一個重要的函式:HookSourceInsightWindow(),這個函式負責將我們的程式碼注入


到“Source  Insight”程序中,這涉及到程式碼遠端注入的很多細節,關於程式碼注入方法將在下一篇:《


給Source Insight做個外掛系列之二--將原生代碼注入到Source Insight程序》中介紹,本篇到此結


束。
Source Insignt檔案標籤外掛:TabSiPlus的下載地址:
點選下載
========

sourceinsight的使用記錄



在windows下開發linux程式,使用vc2005有點大材小用,用linux下的vim吧,又有很多的記憶負擔。


那就用sourceinsight吧。


檔案目錄樹怎麼切換磁碟?
直接在檔案搜尋欄裡面輸入D: 就會切換到D:盤。


0) 跳轉的函式定義處
   ctrl + = 
   跳轉到函式原型: ???


1){}符號的自動縮排。換行時,預設是 在上一行左端向右縮排一個tab,但我想讓對齊,怎麼辦?
         新開一個PROJECT後,點Options->Document Options,彈出對話方塊後先在左上角選好要用的


Document Type,主要就是設C Source File和C++ Source File,選好後點右邊中間的Auto Indent調整


縮排。單選裡一定要點Smart,右邊有兩個複選框Indent Open Brace和Indent Close Brace,具體效果


是如何的可以看SIS的HELP。
    勾選Auto Indent和SMART的效果: 在C程式裡, 如果遇到行末沒有分號的語句,如IF, WHILE, SWITCH


等, 寫到該行末按回車,則新行自動相對上一行縮排四列.
    勾掉indent Open Brace和Indent Close Brace的效果: 繼上一段,在相對縮排行裡, 如果輸入"{"


或"}", 則自動和上一行列對齊。
參考:http://blog.csdn.net/yjzl1911/archive/2010/06/13/5669037.aspx


2)跳轉到最近編輯過的地方 有點像 vc2005的 ctrl+<- 和 ctrl+->.
    si的跳轉快捷鍵是:alt+,alt+. 分別是 alt+逗號和 alt+句號!


3) 跳到指定行 ctrl+g, 這和vc2005一致


4) F3向上搜尋,F4向下搜尋
    shift+F4: 快速搜尋. 不用調出搜尋介面,雙擊關鍵字選擇關鍵字即可搜尋.


5) 快速註釋/取消註釋程式碼段
    好像沒有內建這樣的功能,使用 #if 0 #endif 吧


6) 如何開一個函式 的左大括號 { 跳轉到函式結束的 右大括號位置 }
   vc2005 我記得是 直接 輸入 ctrl+}就會在兩個{}之間來回跳轉
到塊的下面                           : Ctrl+Shift+]
到塊的上面                           : Ctrl+Shift+[


     另外,si雙擊{會選中函式的全部內容
 
7)檢查引用                             : Ctrl+/
這個功能非常有用哦,就像vc2005裡面的查詢所有引用


 8)列操作
  雖然開篇時就說過,SI的列操作功能比較弱,但不等於沒有。先按下Alt鍵,接著就可用滑鼠進行列


選擇,然後就可以刪除指定的列 
  
  9)
Shift+F8
高亮顯示指定標識,快速瀏覽標識的使用情況。 


10)
  專案-專案設定-選中在資料庫中儲存區域性函式符號。 不管那麼多,選中即可。
  選項-引數設定-符號查詢-專案符號路徑-新增專案到路徑。可以把之前建立好的linux核心標頭檔案專案


加到這裡的符號路徑, 這樣你寫程式碼是,比如 str 會自動提示 strcmp strcpy等等東西, 而且可以直


接看到函式原型,功能一點不次於vc2005!


11) 讓source insight 顯示檔案的全路徑
   寫程式碼時,實時的知道當前編輯的檔案是硬碟上的哪個檔案時非常有必要的,不然萬一編輯錯了怎麼辦


?特別是在有同名檔案的時候. 這點vc2005就非常好,在標籤上右鍵就可以開啟檔案位置.
   si也可以滿足你.  只是不能開啟檔案位置.
   選項-引數設定-顯示, 取消選中 "用省略號修剪長路徑名"(該選項出現在倒數第二行).


12) 如何更高效的使用查詢引用, 切換到下一個引用,上一個引用?
   當使用查詢引用功能時,會彈出一個查詢結果頁面,頁面的左側有個小按鈕,可以調到引用的實際位


置。但是每次看完一個要回來才能看下一個很不方便,其實,在工具欄上有兩個小按鈕,可以跳到下一


個引用和上一個引用。並且 Alt+F9  可以直接跳轉到下一個。
    另外,查詢引用的時候,還是用“簡單字串”模式查詢比較靠譜吧,速度慢點,我用另外一個默


認總是找到漏掉幾個,不爽!


 
13)
  關於刪掉半個漢字的問題
  網上流傳一個 *      豬 哥  作 品可以解決該問題,方法如下:


 a)記事本編輯另存為:SuperBackspace.em 即可。
 b) 由於我的si是綠色的,沒有Base專案, 只有自己在 D:/我的文件/Source Insight/Projects/Base 


路徑下新建一個 Base專案。
 c)將SuperBackspace.em 加入到當前base專案中來。
     方法如下:
     c.1)選項-文件選項-解析-語言-SI Macro Language, 然後選擇上面 文件型別-Source Insight 


巨集檔案, 檔案過濾器裡面是 *.EM 
     c.2)然後找到 superasespace.em新增進來。 確保在右側的檔案列表裡可以看到
 d)重啟SI
 e)新增鍵對映,選項-鍵關聯-在左側的列表裡找到 “巨集:SuperBackspace”, 點選分配新建,按鍵


盤的 Backspace鍵,擊鍵出出現 Backspace。ok
 f)試試刪除半個漢字是否ok了?
     
/**
 *       ╭︿︿︿╮
 *       {/ . ./}
 *       (  (oo)  )
 *        ︶︶︶︶
 *      豬 哥  作 品
 *
 * 2006 丁兆傑 Ding Zhaojie
 * [email protected]
 *
 * SuperBackspace Version 0.1beta
 *
 * 代替SourceInsight原有的Backspace功能(希望如此)
 * 增加了對雙位元組漢字的支援,在刪除漢字的時候也能同時刪除漢字的高位元組而緩解半個漢字問題
 * 能夠對游標在漢字中間的情況進行自動修正
 *
 * 安裝:
 * ① 複製入SourceInsight安裝目錄;
 * ② Project→Open Project,開啟Base專案;
 * ③ 將複製過去的SuperBackspace.em新增入Base專案;
 * ④ 重啟SourceInsight;
 * ⑤ Options→Key Assignments,將Marco: SuperBackspace繫結到BackSpace鍵;
 * ⑥ Enjoy!!
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
macro SuperBackspace()
{
    hwnd = GetCurrentWnd();
    hbuf = GetCurrentBuf();
    if (hbuf == 0)
        stop;   // empty buffer
    // get current cursor postion
    ipos = GetWndSelIchFirst(hwnd);
    // get current line number
    ln = GetBufLnCur(hbuf);
    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd))) {
        // sth. was selected, del selection
        SetBufSelText(hbuf, " ");  // stupid & buggy sourceinsight :(
        // del the " "
        SuperBackspace(1);
        stop;
    }
    // copy current line
    text = GetBufLine(hbuf, ln);
    // get string length
    len = strlen(text);
    // if the cursor is at the start of line, combine with prev line
    if (ipos == 0 || len == 0) {
        if (ln <= 0)
            stop;   // top of file
        ln = ln - 1;    // do not use "ln--" for compatibility with older versions
        prevline = GetBufLine(hbuf, ln);
        prevlen = strlen(prevline);
        // combine two lines
        text = cat(prevline, text);
        // del two lines
        DelBufLine(hbuf, ln);
        DelBufLine(hbuf, ln);
        // insert the combined one
        InsBufLine(hbuf, ln, text);
        // set the cursor position
        SetBufIns(hbuf, ln, prevlen);
        stop;
    }
    num = 1; // del one char
    if (ipos >= 1) {
        // process Chinese character
        i = ipos;
        count = 0;
        while (AsciiFromChar(text[i - 1]) >= 160) {
            i = i - 1;
            count = count + 1;
            if (i == 0)
                break;
        }
        if (count > 0) {
            // I think it might be a two-byte character
            num = 2;
            // This idiot does not support mod and bitwise operators
            if ((count / 2 * 2 != count) && (ipos < len))
                ipos = ipos + 1;    // adjust cursor position
        }
    }
    // keeping safe
    if (ipos - num < 0)
        num = ipos;
    // del char(s)
    text = cat(strmid(text, 0, ipos - num), strmid(text, ipos, len));
    DelBufLine(hbuf, ln);
    InsBufLine(hbuf, ln, text);
    SetBufIns(hbuf, ln, ipos - num);
    stop;
}
 
xx)


  本來以為自己對source Insight的使用還算熟練的,結果發現它還支援這麼多先進的以前沒玩過,


或者以為它實現不了的功能。非常棒!!
  關於sourceInsight3.5的縮排問題和庫函式補全問題。
  由於vc自動縮排很智慧,而且編寫庫函式能自動提示補全函式名並提示引數組成,很方便。
  今天研究得出SourceInsight3.5也可以實現這兩個效果。
  1. Preferences->Symbols Lookups:Add Project to Path... 選擇"D:/Program Files/Microsoft 


Visual Studio6.0/VC98/Include後它預設取名為CStandard.PR,點加入所有標頭檔案確定後就可以看到


Project symbol path:下面的文字框裡面多了一個字串"D:/Program Files/Microsoft Visual 


Studio6.0/VC98/Include/CStandard.PR",這樣點確定後,以後所有的工程都可以自動補全庫函式和看


到庫函式的原型了。 
  2. Alt+T開啟Document Options對話方塊,如果你是c++程式碼,那麼選擇c++型別,file filter下面輸


入框下面的兩個複選框第一個Use options from Default type不要選中,一定不要選,要不indent調不


對的,Editing Options下面的複選框選上:Allow auto-complete自動補齊功能,少打幾個字而且補齊


的可以避免不必要的輸入錯誤,Expand tabs把tabs變換成空格,不同編輯器開啟都統一了不會亂,


Enter Key->new line回車建立新行,show line numbers顯示行號看到程式碼很方便的,show right 


margin編寫程式碼時候可以提醒自己不要一行不要太長及時換行,symbol window符號索引開啟很好很強大


,快速定位一個函式或者變數。 


更多快捷鍵資訊參考:
source insight快捷鍵及使用技巧
http://blog.csdn.net/hbd1986/archive/2010/01/27/5260727.aspx
========

source insight設定Project Symbol Path



今天使用source insight檢視程式碼,不小心刪除了Base專案,導致c標準庫符號、mfc中的符號不能被識


別。於是自己新建了一個Base專案,發現不能被別的專案所公用。最後在SI的幫助文件裡面找到了解決


方法。
image
這裡的path跟Path路徑的概念幾乎一樣,都是在當前專案中找不到符號的時候最後查詢的地方。
========

程式碼閱讀分析工具Understand 2.0試用



Understand 2.0是一款原始碼閱讀分析軟體,功能強大。試用過一段時間後,感覺相當不錯,確實可以


大大提高程式碼閱讀效率。由於Understand功能十分強大,本文不可能詳盡地介紹它的所有功能,所以只


列舉本人認為比較重要或有特色的功能,以做拋磚引玉之舉。
Understand 2.0可以從http://www.scitools.com/下載到,安裝後可以試用15天。
使用Understand閱讀程式碼前,要先建立一個Project,然後把所有的原始碼檔案加入到這個Project裡。


這裡我建立了一個ATLSTL的Project,然後把Microsoft Visual Studio 2008帶的ATL、STL、MFC的源代


碼加入其中。需要說明的是,Understand支援很多種原始碼,包括C#,而不光是C++程式碼。
這是整個使用者介面的概覽,可以看到和Visual Studio的風格很相似。所有了子視窗都可以任意停靠或折


迭。
Understand介面概覽
 
 下面逐個介紹Understand的特性。
一,強大的自動繪圖能力。
Understand可以生成許多種有用的圖形,如類關係圖、函式呼叫關係圖、標頭檔案包括關係等。下面是


CFile的類圖。
CFile類圖
 
當然,如果願意,你可以生成CObject派生的整個MFC的類圖


(http://p.blog.csdn.net/images/p_blog_csdn_net/qwang24/EntryImages/20090411/ButterflyGraph


-CObject.png)。這種圖以前只能在MSDN裡可以見到,現在可以在瞬間自動生成,很酷!
 
還可以顯示函式的呼叫關係:
 
函式呼叫關係圖
 
以及標頭檔案的包括關係:
標頭檔案包括圖
 
二,出色的增量搜尋功能
增量搜尋也許不是新概念,在Visual Studio裡早就有。但是Understand裡的增量搜尋具有動態程式碼加亮


的功能。也就是說,可以把選中的識別符號的所有例項,都以醒目的顏色顯示出來,對於閱讀程式碼時,非


常有幫助。如下圖,對函式引數pFileTime執行增量搜尋,則它出現的過地方都會被標示出來。這樣,這


個引數是如何被使用的,一目瞭然。
 
增量搜尋
 
 
三,豐富的識別符號資訊
Understand的程式碼資訊資料庫十分完善,所有的識別符號可以分類顯示。每一類識別符號又具有不同的資訊


。如關於函式的資訊,可以顯示定義它的檔名,返回值型別,引數資訊,呼叫函式,被呼叫函式,引


用這個函式的資訊,程式碼量等。其中,引用資訊裡會有引用型別,如申明、呼叫、定義等,非常實用。
函式資訊
 
而對於變數資訊,而以顯示變數在哪裡定義的,是設定變數的值還是使用變數的值等。
變數資訊
 
四,方便的搜尋功能
很多視窗都有方便的搜尋功能,便於快速定位需要的資訊。如專案瀏覽器裡,可以輸入檔名,快速找


到相關的檔案。
檔名搜尋
 
Understand還有很多其他強大的功能,如報表功能,程式碼編輯,程式碼變化跟蹤等。
當然,和其他所有的程式碼分析工具軟體一樣,Understand也有一些不足之處,如有時候會解析錯誤,不


支援COM程式碼的Attribute擴充套件,對機器配置要求較高,對正則表示式的支援不完善等。
 
備註:
解決不能正確解析COM的Attribute擴充套件問題: 搜尋正則表示式: /]/s*$ , 替換為 /]; (使用


Visual Studio的在多個檔案中替換功能,不能直接使用Unserstand替換。)
解決不能正確解析__interface關鍵字問題: 在project選項裡增加巨集定義,把__interface定義為


struct。
========