教你如何剖析源碼

一、源碼閱讀需求

  在學習中,我們會需要了解,學習,使用一個框架,一個新的函數庫。在工作中,因為業務需求,因為性能問題,可能通過一個更高性能的工具,架構去優化我們的程序。

那么,問題就來了。網站下載了源碼,目錄一層一層,頭文件無數,打開之后又是一個函數上百行代碼,一個類可能有近千行代碼。看著都崩潰了,只想關機去靜靜。

那么,現在。就談談如何閱讀源碼的問題了。

二、源碼閱讀方法

  認知過程:

  ①了解庫/框架的功能-->具體做法:找到相關文檔或者書籍,獲取庫/框架的功能簡介。知道他是干什么的。(相關知識儲備足夠了,那么學習這個框架就會事半功倍的)

  ②認識庫,能夠簡單使用庫-->具體做法:通過官方文檔或者工具,獲取框架的外部接口,嘗試在程序中使用它。這個過程可以是個深度優先、廣度優先方式。看個人學習了解方式和能力了(ps:a.接收能力強,那么你可以嘗試將大致的功能都嘗試調用,全局體驗,了解整個庫/框架的使用,作用,而后深入剖析。

        b.如果你是個可以做到深入,能鉆進去的人,那么你就通過深度優先方式,逐個模塊的深入學習。然后慢慢的熟悉整個框架)

  ③閱讀源碼,了解整個框架/抽離核心,實現簡潔版-->這個過程可能對不同的人就有差距了,深入理解的,那么就可能做到抽離框架核心,實現簡潔版,獲取框架思想,并且做到框架功能優化,提交bug等。而一般點,那就是熟悉框架結構,了解功能接口,在學習工作中使用。當然,這樣也許在程序中出現某些bug時,就不能準確定位錯誤并改進了。

  ④第三個過程其實是一個漫長的過程,還要能夠保持足夠的耐心動力去探索。可以具體劃分為:

    a.根據目錄層次,將整個框架進行模塊劃分認知,了解模塊間耦合關系。

    b.進入目錄,學習一個模塊的實現細節,這時。可以選擇,拷貝一份源碼,閱讀同時加入注釋。

    c.遇到類間關系復雜的地方,可以通過UML類圖視覺體現關系,而后詳細學習。

boss 級方案

  利用UML工具,將源碼生成對應UML圖,了解類接口,成員函數以及類間關系。然后深入源碼(ps這個太強大,一般人駕馭不了)

  當然,vs調試過程也會有這個功能。http://jingyan.baidu.com/article/7f41ecec15092c593d095c17.html

三、工具推薦

  windows環境 源碼剖析工具:vs20XX (源程序閱讀,測試程序運行調試),everything(目錄文件搜索),source insight(源文檔閱讀,支持函數跳轉,體現調用樹,關聯性等)

  linux環境 工具推薦:vim?+?ctags?+?taglist ?

四、工具簡單使用教程

  ①vs

http://blog.csdn.net/anzhongliu/article/details/48750637

http://feiger.cn/?p=4118

②everything

  這就是個簡單的目錄搜索工具,可以找到任何你有的東西哦。---保證讓你沒有小秘密可言。

③source Insight

  這個就是我們今天介紹的重點了

a.工具簡介:sourceinsight,英文解讀“深入到源代碼”該軟件只具有代碼的閱讀,編輯,簡單語法檢查功能,而不具有編譯功能。但是在閱讀大規模工程代碼時,sourceinsight在代碼導航,高亮注釋,顏色區分,代碼關聯等方面對于源碼閱讀都有 很好地幫助。

b.工具獲取http://www.sourceinsight.com/

c.基本使用

源碼導入/新建工程

project-->newProject(alt+shift+n)

添加項目文件:也就是你需要查看的源碼,在文件系統中找到需要添加的項目文件夾,然后點擊add All即可

彈窗提示是否遞歸添加子文件夾,選中,確定

至此,工程建立完成,那么。下面就看看具體如何使用軟件進行源碼閱讀了

比較常用的視圖,設置出來

?

對于比較長的文件,那么如果順序讀源文件肯定不方便了。這時,你應該發現左邊的的選項框了。

且文件瀏覽中,支持快速定位,跳轉等功能,這個窗口可以看到具體的類,函數調用關系,引用,使用位置等。

快捷方式:

Source Insight常用的快捷鍵:?
??? Ctrl+= :Jump to definition?
??? Alt+/ :Look up reference?
??? F3 : search backward?
??? F4 : search forward?
??? F5: go to Line?
??? F7 :Look up symbols?
??? F8 :Look up local symbols?
??? F9 :Ident left?
??? F10 :Ident right?
??? Alt+, :Jump backword?
??? Alt+. : Jump forward?
??? Shift+F3 : search the word under cusor backward?
??? Shift+F4 : search the word under cusor forward?
??? F12 : incremental search?
??? Shift+Ctrl+f: search in project?
??? shift+F8 : hilight word?
Source Insight的窗口操作:?
??? project window Ctrl+O打開?
??? symbol window Alt+F8打開和關閉?
??? Contex Window 自定義鍵打開和關閉?
??? Relation Window 自定義鍵打開 先鎖定再刷新聯系

?

最后,關于sourceinsight的使用,參考

http://www.cnblogs.com/olvo/archive/2012/05/04/2483424.html

http://blog.csdn.net/lyl_98/article/details/889706

有任何疑問或者改正之處,歡迎交流。

轉載于:https://www.cnblogs.com/lang5230/p/5516348.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SPEL + 中的錯誤處理

SPEL 中的錯誤處理 如果在SPEL程序中發生錯誤,可以將執行轉到錯誤處理例程中進行錯誤處理。該例程必須在函數定義內。下一頁的表格顯示了用于錯誤處理的程序指令。 項目 目的 OnErr 使用OnErr語句定義錯誤處理…

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分類器檢測鹵素燈泡的好壞

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分類器檢測鹵素燈泡的好壞 示例程序源碼(加注釋) 得到halcon默認圖片存儲路徑 get_system (‘image_dir’, HalconImages) 獲得操作系統類型 get_system (‘operating_system’, OS) OS{0:2}的意思是…

php調用API支付接口(轉自劉68)

首先訪問 https://charging.teegon.com/ 注冊賬號, 找到開發配置 記下client_id和client_secret。 點擊 天工開放平臺 點擊天工收銀 點擊 SDK下載與使用 選擇php版下載 解壓后獲得 打開form.php這個是樣板文件可以用它來測試是否成功,測試前需要先修…

S3C2440 SPI驅動框架

S3C2440 SPI驅動代碼詳細解讀: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一、platform device and board_info /* /arch/arm/plat-s3c24xx*/static struct resource s3c_spi0_resource[] { [0] {.start S3C24XX_PA_SPI,.end S3C24XX_PA_SPI 0…

單目相機標定原理

一.相機標定主要涉及三個坐標系:圖像坐標系、攝像機坐標系和世界坐標系 【圖像坐標系】 攝像機采集的圖像變換為數字圖像后,每副數字圖像在計算機內為M x N數組,M行N列的圖像中每一個元素(pixel)數值就是圖…

HALCON示例程序classify_image_class_gmm.hdev使用GMM分類器分割彩色圖片

HALCON示例程序classify_image_class_gmm.hdev使用GMM分類器分割彩色圖片 示例程序源碼(加注釋) dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, ‘black’, WindowHandle) set_display_font (WindowHandle, 14, ‘mono’, …

Android開始之 activity_lifecycle和現場保護

生命周期: oncreate—onstart—onresume,--onpause--onstop,——onrestart——onstart——onresume,。。onpause。。。onstop。。。ondestroy 現在保護---保存系統狀態 通過這個方法保存到數據庫中或者xml中,&#xff…

Apache啟動錯誤:could not bind to address[::]:443

Q:Windows環境下啟動apache報錯如下: 可是在httpd.conf文件中apache listen的明明是http 80端口,為什么會報443的錯誤? A:因為你的計算機安裝了VM,所有有個vm的進程一直占用著443端口,在命令行下…

針孔相機拍攝的圖像坐標和空間點的對應關系

一:攝像機成像原理 攝像機成像模型一般有三種:透鏡投影模型(小孔攝像機模型)、正交投影模型和透視投影模型 光學中最基本的高斯成像公式:1/u 1/v 1/f (式一) 原理圖如下: 二:認識三個…

window.onload中動態獲得img的高度

$(function(){}); window.οnlοadfunction(){} $(function(){}) 是在DOM結構渲染完成以后調用的,這時候網頁中一些資源還沒有加載,比如圖片等資源,但是DOM結構已經渲染成功了 window.onload是在網頁DOM結構渲染完成,而且資源已經…

HALCON關于顯示的函數與介紹(持續更新)

點擊下方直達算子藍色字體 目錄1、dev_update_off ();dev_update_on2、dev_close_window ()3、dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)4、set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )5、dev_set_draw(…

python -- 三元運算符

格式 : a if 條件 else b 示例 : 在 return 中使用 def com(a,b): # 返回最大值return a if a > b else b賦值時使用: l 1 if 2 > 1 else 2轉載于:https://www.cnblogs.com/yanjingnan/p/6494786.html

矩陣乘法

矩陣乘法的通俗的我自己用的理解方式 CAB. 則Cij∑aikbkj (k屬于那個范圍),所以首先矩陣相乘的必須是A矩陣的列數等于b矩陣的行數。 第二就是C的意義了,cij表示A的第i行與B的第j列每個數對應相乘,因為上面的條件,所以A的第i行的數…

HALCON示例程序classify_image_class_knn.hdev使用KNN分類器對多通道圖像進行分割

HALCON示例程序classify_image_class_knn.hdev使用KNN分類器對多通道圖像進行分割 示例程序源碼(加注釋) 顯示相關設置 dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, ‘black’, WindowHandle) set_display_font (WindowH…

DELL XPS 9350 無線網卡DW1820A WIN7驅動異常解決

電腦型號:戴爾XPS 13 9350 故障現象: 安裝完其他驅動都正常,打上官網的無線藍牙一體驅動,只能驅動藍牙,無線網卡無法驅動 故障解決: 開機F2,到Wireless選項現將藍牙功能關閉,保存重啟到windows下,將官網的無線驅動解壓到文件夾,在設備管理器中選中未知的網絡設備點更新驅動,手動…

粥做得好不好,全憑一個良心!

粥做得好不好,全憑一個良心! 工作不也是憑良心么! 文章中的紅色字體表達了一切! 霜降節氣的到來,意味著冬季的臨近,而霜降后氣溫的降低,利于蔬菜的淀粉沉淀,收漿后的蓮藕也變得更為…

內存分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc

很多地方都會使用內存,內存使用過程中操作不當就容易崩潰,無法運行程序,上網Google學習一下,了解整理下他們之間的區別以及使用 ,獲益匪淺 0x01 各自的定義和理解 (1)先看GlobalAlloc() GlobalAlloc()主要用于Win32應用…

黑盒測試

引言: 什么是黑盒測試呢!? 像我一樣的測試小白就會望文生義了:對黑盒子測試 那么黑盒子是什么!? 思考5秒后,得出了這樣的答案:黑盒子就是黑色的盒子,嘿嘿! 正文&#xf…

HALCON示例程序classify_image_class_mlp.hdev如何使用MLP分類器分割RGB圖像

HALCON示例程序classify_image_class_mlp.hdev如何使用MLP分類器分割RGB圖像 示例程序源碼(加注釋) 關于顯示相關顯示在其他帖子有介紹。 dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, ‘black’, WindowHandle) set_disp…

Expo大作戰(十二)--expo中的自定義樣式Custom font,以及expo中的路由RouteNavigation

簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網 我猜去全部機翻個人修改補充…