《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 業界動態 > 睡覺的時候,程序能不能自動查 bug?

睡覺的時候,程序能不能自動查 bug?

2020-02-17
來源:搜狐科技
關鍵詞: Bug ChaosEngineering Google

e067552dc5b54730baa4006c3a4f4e8c.jpeg

  作者 | 杜沁園 等

  責編 | 郭芮

  出品 | CSDN(ID:CSDNnews)

  曾在 Hacker News 上看到過一個 Oracle 工程師處理 bug 的 日常:

  先花兩周左右時間來理解 20 個參數如何通過神奇的組合引發 bug。

  改了幾行代碼,嘗試對 bug 進行修復,提交測試集群開始跑近百萬個測試 case,通常要 20~30 小時。

  運氣好的話會有 100 多個 case 沒過,有時候上千個也有可能,只好挑選幾個來看,發現還有 10 個參數之前沒有注意到。

  又過了兩周,終于找到了引起 bug 的真正參數組合,并跑通了所有測試。并增加 100 多個測試 case 確保覆蓋他的修改。

  經過一個多月的代碼 review,他的修改終于合并了,開始處理下一個 bug……

  后來這個工程師感慨說:“I don't work for Oracle anymore. Will never work for Oracle again!”

  Oracle 12.2 有將近 2500 萬行 C 代碼,復雜系統的測試是一件艱難、艱苦和艱巨的事情,而測試一個分布式數據庫的情況就更復雜了。我們永遠不知道用戶可能寫出什么樣的 SQL,表結構和索引有多少種組合,此外還要考慮集群在什么時候節點發生宕機,以及受到網絡抖動、磁盤性能退化等因素的影響——可能性幾乎是無限的。

  那么有沒有一種方法能讓程序自動幫我們查 bug?

  如何做到「睡覺的時候讓程序自動查 bug」?

  項目的思路其實很簡單,如果在每次跑 case 的時候能用統計學的方法對足夠多次實驗的代碼路徑進行分析,就可以找出疑似 bug 的代碼,最終結果以代碼染色的方式由前端可視化呈現,就得到了如下圖展示的效果:

2.gif

  「顏色越深,亮度越高」表示包含錯誤邏輯的可能性越大。該方法不僅適用于數據庫系統的測試,同樣適用于其他任何復雜的系統。

  背后的原理

  項目最初是受到 VLDB 的一篇論文的啟發 APOLLO: Automatic Detection and Diagnosis of Performance Regressions in Database Systems,該論文主要圍繞如何診斷引發數據庫性能回退的代碼,其核心思想也同樣適用于排查 bug。論文中提到的自動診斷系統由 SQLFuzz,SQLMin 和 SQLDebug 三個模塊組成。

3.png

  SQLFuzz:負責隨機生成 SQL,并利用二分查找定位到性能回退的前后兩個版本,傳遞給 SQLMin 模塊。

  SQLMin:通過剪枝算法將 SQLFuzz 生成的 SQL 進行化簡,得出能夠復現該問題的最小 SQL ,傳遞給 SQLDebug 模塊。目的是減少無關的代碼路徑,降低噪音。

  SQLDebug:對源碼進行插樁,使其在執行 SQL 時能夠輸出代碼的執行路徑。然后對兩個版本的代碼路徑進行分析,建立一個統計模型來定位問題的位置。

  最終系統自動生成測試報告,內容包含:

  哪一次的代碼 commit 引入了性能回退。

  存在問題的代碼源文件。

  具體的函數位置。

  而實際上,考慮到并發、循環、遞歸等帶來的影響,代碼執行路徑分析會非常復雜。為了保證能夠在 Hackathon 那么短的時間內展示出效果,我們又參考了另一篇論文 Visualization of Test Information to Assist Fault Localization,其核心思想是通過統計代碼塊被正確和錯誤測試用例經過次數,再基于分析算法來涂上不同的顏色,簡單而實用。

4.png

  其實借助這個思路也可以應用到其他領域,后面我們將展開來介紹。接下來我們先來看看 SQLDebug 是如何實現的。

  聊聊細 (gān) 節 (huò)

  如何自動產生測試 case?

  由于是基于統計的診斷,我們需要先構建足夠多的測試用例,這個過程當然最好也由程序自動完成。事實上,grammar-based 的測試在檢驗編譯器正確性方面有相當長的歷史,DBMS 社區也采用類似的方法來驗證數據庫的功能性。比如:微軟的 SQL Server 團隊開發的 RAGS 系統對數據庫進行持續的自動化測試,還有社區比較出名的 SQLSmith 項目等等。今年 TiDB Hackathon 的另一個獲獎項目 sql-spider 也是實現類似的目的。

  這里我們暫時采用 PingCAP 開源的隨機測試框架 go-randgen 實現 SQL fuzzing,它需要用戶寫一些規則文件來幫助生成隨機的 SQL 測試用例。規則文件由一些產生式組成。randgen 每次從 query 開始隨機游走一遍產生式,生成一條 SQL,產生一條像下圖紅線這樣的路徑。

5.png

  我們將每個產生式生成正確與錯誤用例的比例作為該產生式的顏色值,繪制成一個頁面,作為 SQLFuzz 的展示頁面。通過該頁面,可以比較容易地看出哪條產生式更容易產生錯誤的 SQL。

6.gif

  代碼跟蹤

  為了跟蹤每一條 SQL 在運行時的代碼執行路徑,一個關鍵操作是對被測程序進行插樁 (Dynamic Instrumentation)。VLDB 論文中提到一個二進制插樁工具 DynamoRIO,但是我們不確定用它來搞 Go 編譯的二進制能否正常工作。換一個思路,如果能在編譯之前直接對源碼進行插樁呢?

  參考 go cover tool 的實現,我們寫了一個專門的代碼插樁工具 tidb-wrapper。它能夠對任意版本的 TiDB 源碼進行處理,生成 wrapped 代碼。并且在程序中注入一個 HTTP Server,假設某條 SQL 的摘要是 df6bfbff(這里的摘要指的是 SQL 語句的 32 位 MurmurHash 計算結果的十六進制,主要目的是簡化傳輸的數據),那么只要訪問 http://<tidb-server-

7.png

ip>::43222/trace/df6bfbff 就能獲得該 SQL 所經過的源碼文件和代碼塊信息。

  因為主要目標是正確性診斷,所以我們限定系統不對 TiDB 并發執行 SQL,這樣就可以認為從 server/conn.go:handleQuery 方法被調用開始,到 SQLDebug 模塊訪問 trace 接口的這段時間所有被執行的基本塊都是這條 SQL 的執行路徑。當 SQLDebug 模塊訪問 HTTP 接口,將會同時刪除該 SQL 相關的 trace 信息,避免內存被撐爆。

  基本塊統計

  SQLDebug 模塊在獲取到每條 SQL 經過的基本塊信息后,會對每個基本塊建立如下的可視化模型。

  首先是顏色,經過基本塊的失敗用例比例越高,基本塊的顏色就越深。

8.png

  然后是亮度,經過基本塊的失敗用例在總的失敗用例中占的比例越高,基本塊的亮度越高。

9.png

  已經有了顏色指標,為什么還要一個亮度指標呢?其實亮度指標是為了彌補“顏色指標 Score”的一些偏見。比如某個代碼路徑只被一個錯誤用例經過了,那么它顯然會獲得 Score 的最高分 1,事實上這條路徑不那么有代表性,因為這么多錯誤用例中只有一個經過了這條路徑,大概率不是錯誤的真正原因。所以需要額外的一個亮度指標來避免這種路徑的干擾, 只有顏色深,亮度高的代碼塊,才是真正值得懷疑的代碼塊。

  上面的兩個模型主要是依據之前提到的 Visualization 的論文,我們還自創了一個文件排序的指標,失敗用例在該文件中的密度越大(按照基本塊),文件排名越靠前:

10.png

  前端拿到這些指標后,按照上面計算出的文件排名順序進行展示,越靠前的文件存在問題的風險就越高。

11.png

  當點擊展開后可以看到染色后的代碼塊:

12.png

  我們經過一些簡單的實驗,文件級別的診斷相對比較準確,對于基本塊的診斷相對還有些粗糙,這跟沒有實現 SQLMin 有很大關系,畢竟 SQLMin 能去除不少統計時的噪聲。

  還能不能做點別的?

  看到這里,你可能覺得這個項目不過是針對數據庫系統的自動化測試。而實際上借助代碼自動調試的思路,可以給我們更多的啟發。

  源碼教學

  閱讀和分析復雜系統的源碼是個頭疼的事情,基于源碼的運行時可視化跟蹤能否做成一個通用工具呢?這樣在程序執行的同時就可以直觀地看到代碼的運行過程,對快速理解源碼一定會大有幫助。更進一步,配合源碼在線執行有沒有可能做成一個在線 web 應用呢?

  全鏈路測試覆蓋統計

  語言本身提供的單測覆蓋統計工具已經比較完備了,但一般測試流程中還要通過 e2e 測試、集成測試、穩定性測試等等。能否用本文的方法綜合計算出各種測試的覆蓋度,并且與 CI 系統和自動化測試平臺整合起來。利用代碼染色技術,還可以輸出代碼執行的熱力圖分析。結合 profiler 工具,是不是還可以輔助來定位代碼的性能問題?

  Chaos Engineering

  在 PingCAP 內部有諸多的 Chaos 測試平臺,用來驗證分布式系統的魯棒性,譬如像 Schrodinger,Jepsen 等等?;煦鐪y試有個弊端就是,當跑出問題之后想再次復現就很難,所以只能通過當時的情形去猜代碼可能哪里有問題。如果能在程序運行時記錄代碼的執行路徑,根據問題發生時間點附近的日志和監控進一步縮小范圍,再結合代碼路徑進行分析就能精確快速的定位到問題的原因。

  與分布式 Tracing 系統集成

  Google 有一篇論文是介紹其內部的 分布式追蹤系統 Dapper ,同時社區也有比較出名的項目 Open Tracing 作為其開源實現,Apache 下面也有類似的項目 Skywalking。一般的 Tracing 系統主要是跟蹤用戶請求在多個服務之間的調用關系,并通過可視化來輔助排查問題。但是 Tracing 系統的跟蹤粒度一般是服務層面,如果我們把 trace_id 和 span_id 也當作標注傳遞給代碼塊進行打樁,那是不是可以在 Tracing 系統的界面上直接下鉆到源碼,聽起來是不是特別酷?

  接下來的工作

  以上我們只完成了一個非常簡單的原型,距離真正實現睡覺時程序自動查 bug 還有一段路要走,我們計劃對項目持續的進行完善。

  接下來,首先要支持并行執行多個測試用例,這樣才能在短時間得到足夠多的實驗樣本,分析結果才能更加準確。另外,要將注入的代碼對程序性能的影響降低到最小,從而應用于更加廣泛的領域,比如性能壓測場景,甚至在生產環境中也能夠開啟。

  看到這里可能你已經按耐不住了,附上項目的完整源碼:

  https://github.com/fuzzdebugplatform/fuzz_debug_platform

  Welcome to hack!

  作者簡介:

  黃寶靈,PingCAP 前端開發工程師,喜歡 React 和 Type。

  滿俊朋, 效率工具工程師, 目前在 PingCAP 從事 Benchmark, Stability 相關工具的研發。

  杜沁園,中科大研究生,曾在 PingCAP 實習,從事數據庫測試工具的研發。

  韓玉博,中科大研究生,在 Tradeshift 實習,從事前端開發。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美国产国产综合| 另类成人小视频在线| 欧美精品久久久久久久免费观看| 欧美一区二区大片| 国产精品成人观看视频免费| 欧美精品久久久久久久久老牛影院| 久久久久久亚洲精品中文字幕| 亚洲欧美文学| 91久久精品国产91性色tv| 久久夜色精品亚洲噜噜国产mv| 国产偷国产偷亚洲高清97cao| 日韩亚洲一区在线播放| 极品av少妇一区二区| 好吊日精品视频| 亚洲大片在线| 欧美日韩99| 亚洲一区尤物| 影音先锋成人资源站| 欧美精品一二三| 激情一区二区三区| 欧美日韩久久不卡| 国产精品普通话对白| 国产精品网站在线| 国产精品高潮呻吟久久av黑人| 国产精品成人在线| 亚洲综合另类| 欧美四级剧情无删版影片| 国产精品红桃| 欧美日韩免费一区| 国产婷婷色综合av蜜臀av| 欧美一二区视频| 国产日韩欧美在线一区| 欧美日韩国产123区| 亚洲人成网站777色婷婷| 极品少妇一区二区三区精品视频| 午夜免费在线观看精品视频| 日韩午夜在线视频| 欧美一级视频一区二区| 久久嫩草精品久久久精品一| 欧美日韩中文另类| 精品盗摄一区二区三区| 国产精品福利在线| 久久精品在线观看| 欧美欧美全黄| 激情六月婷婷综合| 久久久av网站| 亚洲午夜精品国产| 亚洲资源av| 国产一区在线免费观看| 欧美成人视屏| 国内外成人在线视频| 欧美另类女人| 国产精品狠色婷| 国产精品一区二区三区观看| 午夜精品久久久久久久久久久久| 欧美黄色小视频| 欧美日韩你懂的| 欧美日韩美女在线观看| 狠狠色丁香婷婷综合| 亚洲一区制服诱惑| 欧美激情视频一区二区三区不卡| 狠狠色丁香婷婷综合久久片| 久久精品人人| 一区二区三区.www| 日韩视频一区二区在线观看| 欧美色区777第一页| 亚洲男人的天堂在线aⅴ视频| 亚洲第一中文字幕在线观看| 久久精品三级| 日韩一区二区精品| 国产精品萝li| 国产精品每日更新在线播放网址| 亚洲欧美国产精品桃花| 国产农村妇女毛片精品久久莱园子| 国产一区二区三区四区| 久久成人精品无人区| 欧美激情a∨在线视频播放| 国产精品免费网站| 国产亚洲欧美日韩一区二区| 亚洲精品乱码久久久久久蜜桃麻豆| 久久亚裔精品欧美| 日韩视频不卡| 老牛嫩草一区二区三区日本| 欧美色图天堂网| 久久久久久9999| 国产精品久久国产精品99gif| 亚洲欧洲综合另类在线| 亚洲国产天堂久久国产91| 国产日韩欧美高清| 夜夜嗨av色综合久久久综合网| 国产精品萝li| 国产综合色产| 国产精品白丝黑袜喷水久久久| 在线观看福利一区| 欧美视频在线一区| 尤物视频一区二区| 欧美一级视频一区二区| 久久久久国产免费免费| 欧美日韩免费观看一区三区| 欧美女主播在线| 男女av一区三区二区色多| 国产精品影院在线观看| 激情自拍一区| 国产欧美视频一区二区| 亚洲乱码日产精品bd| 欧美一区二区三区免费观看视频| 欧美成人乱码一区二区三区| 国产色综合天天综合网| 老司机午夜免费精品视频| 欧美人与性动交α欧美精品济南到| 伊人久久久大香线蕉综合直播| 免费在线播放第一区高清av| 久久国产精品久久久久久电车| 日韩天堂在线观看| 国产亚洲美州欧州综合国| 国产精品永久免费观看| 亚洲午夜精品久久| 国产精品网站一区| 亚洲一二区在线| 国产欧美一区二区三区沐欲| 亚洲电影专区| 欧美亚洲不卡| 国产精品久久久久一区二区三区共| 欧美电影美腿模特1979在线看| 久久精品国产精品亚洲综合| 亚洲欧美激情视频在线观看一区二区三区| 欧美日韩三级电影在线| 国产综合18久久久久久| 国产欧美一区二区精品忘忧草| 欧美性猛交视频| 国产精品盗摄久久久| 欧美肉体xxxx裸体137大胆| 亚洲高清久久网| 亚洲欧洲午夜| 影音先锋在线一区| 老司机精品视频网站| 欧美一区二区三区久久精品| 午夜一区不卡| 久久蜜桃香蕉精品一区二区三区| 欧美在线在线| 美日韩精品免费| 久久亚洲精选| 亚洲视频每日更新| 在线观看成人av| av成人动漫| 嫩模写真一区二区三区三州| 国产精品视频区| 这里只有精品丝袜| 欧美不卡视频一区| 在线播放视频一区| 欧美与欧洲交xxxx免费观看| 欧美国产亚洲另类动漫| 国产日韩亚洲欧美精品| 欧美wwwwww| 亚洲一区二区三区777| 亚洲一卡久久| 国产精品免费看| 亚洲欧美另类久久久精品2019| 国产情人综合久久777777| 亚洲狼人精品一区二区三区| 男女av一区三区二区色多| 国产精品一区二区欧美| 一本一道久久综合狠狠老精东影业| 午夜在线视频观看日韩17c| 亚洲精品一区二区三区婷婷月| 美女脱光内衣内裤视频久久网站| 国产伦精品一区二区三| 欧美极品一区二区三区| 欧美精品三级在线观看| 亚洲免费网址| 午夜精彩国产免费不卡不顿大片| 免费中文日韩| 欧美精品自拍| 国产老肥熟一区二区三区| 久久成人国产| 国产欧美日韩另类视频免费观看| 亚洲精品国精品久久99热一| 久久激情视频久久| 久久漫画官网| 欧美成人综合一区| 久久亚洲一区| 一区二区三区色| 国产午夜精品视频| 欧美日韩综合视频| 亚洲福利在线视频| 欧美日韩一区二区三区在线看| 国产精品免费区二区三区观看| 亚洲精品免费在线观看| 一区二区三区在线观看欧美| 国产永久精品大片wwwapp| 久热国产精品| 亚洲性av在线| 影音先锋中文字幕一区二区| 老司机精品视频一区二区三区| 国产伦精品一区二区三区视频孕妇| 国产精品乱码人人做人人爱| 亚洲免费观看高清完整版在线观看| 亚洲午夜91| 国产精品www色诱视频| 欧美一区二区三区视频免费| 国产毛片一区二区| 欧美日韩福利在线观看| 午夜精品久久久久久99热| 国产日韩欧美麻豆| 国产视频亚洲精品| 欧美日韩国产高清视频| 欧美亚洲综合网| 久久综合一区| 国产伦精品一区二区三| 国产精品美女www爽爽爽视频| 最新高清无码专区| 国产精品久久久久久久久久久久久久| 亚洲午夜在线| 亚洲午夜黄色| 亚洲无玛一区| 激情五月婷婷综合| 国产欧美一区二区三区在线老狼| 国产美女精品视频| 一区二区日韩| 亚洲一区二区三区免费在线观看| 欧美国产一区二区三区激情无套| 国产又爽又黄的激情精品视频| 91久久精品国产91性色tv| 欧美一区二区三区免费视频| 国产精品欧美日韩| 一本色道久久99精品综合| 亚洲一区成人| 亚洲成色www8888| 99精品视频免费全部在线| 欧美精品综合| 国产精品三级久久久久久电影| 欧美日韩国产成人在线观看| 国产精品高潮呻吟久久| 免费久久久一本精品久久区| 欧美激情中文字幕乱码免费| 日韩亚洲欧美成人一区| 亚洲精品久久久久久下一站| 精品91久久久久| 国产精品视频一二三| 一区二区三区高清| 黄色av一区| 国产一区二区在线观看免费| 亚洲欧美日韩视频二区| 亚洲国产专区校园欧美| 一区二区久久久久久| 国产精品国产福利国产秒拍| 欧美激情第10页| 香蕉av福利精品导航| 极品裸体白嫩激情啪啪国产精品| 亚洲二区三区四区| 欧美午夜剧场| 亚洲一区亚洲二区| 老色鬼精品视频在线观看播放| 性欧美18~19sex高清播放| 午夜精品久久久久久久99樱桃| 欧美区在线播放| 久久综合精品国产一区二区三区| 在线精品亚洲| 国产精品理论片在线观看| 黄色影院成人| 国产精品一区二区在线观看不卡| 欧美国产三级| 午夜在线成人av| 夜夜躁日日躁狠狠久久88av| 一个色综合av| 国产精品色一区二区三区| 国产精品福利在线观看网址| 欧美午夜性色大片在线观看| 久久超碰97人人做人人爱| 欧美激情久久久久| 国产综合色一区二区三区| 久久婷婷成人综合色| 蜜桃av一区二区| 国产欧美69| 亚洲欧美日韩视频一区| 欧美高清视频在线| 国产一区二区三区精品欧美日韩一区二区三区| 你懂的国产精品永久在线| 午夜精品一区二区三区在线视| 欧美国产亚洲视频| 欧美成人在线免费观看| 老司机午夜精品视频在线观看| 亚洲欧美日韩国产中文在线| 欧美国产高潮xxxx1819| 亚洲在线黄色| 久久久久久午夜| 久久综合狠狠综合久久激情| 国产一区二区在线观看免费播放| 99在线精品视频在线观看| 国产一级一区二区| 午夜精品福利一区二区三区av| 亚洲私人影院在线观看| 一区二区三区波多野结衣在线观看| 国产精品自拍在线| 欧美大片在线看| 久久精品男女| 好看的亚洲午夜视频在线| 国产午夜精品久久久久久免费视| 国户精品久久久久久久久久久不卡| 在线观看视频免费一区二区三区| 欧美人妖另类| 国产精品人成在线观看免费| 国产亚洲欧美一区| 欧美美女福利视频| 欧美日韩国产精品一区二区亚洲| 99xxxx成人网| 亚洲视频在线看| 国产精品99久久久久久宅男| 国产精品亚洲а∨天堂免在线| 欧美—级在线免费片| 亚洲一区二区高清视频| 亚洲免费在线视频| 久久综合久久综合这里只有精品| 日韩午夜在线电影| 国产精品影片在线观看| 国产日产欧产精品推荐色| 欧美一区二区高清在线观看| 欧美一级夜夜爽| 欧美日韩和欧美的一区二区| 久久久综合激的五月天| 久久免费观看视频| 国产精品免费网站| 狠狠综合久久av一区二区小说| 亚洲三级毛片| 国产精品福利av| 国产精品国产自产拍高清av王其| 猛男gaygay欧美视频| 国产精品亚洲网站|