1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        我是怎么調(diào)試代碼的?

        共 1990字,需瀏覽 4分鐘

         ·

        2021-07-08 14:59


        相信大家對如何調(diào)試代碼很感興趣。我也很感興趣,但是自己屬實也不知道啥高端調(diào)試技巧,這里拋磚引玉一波,介紹下自己常用的代碼調(diào)試手段,大家有更好的調(diào)試手段歡迎在留言區(qū)留言,不要私藏。



        如何定位crash問題?



        關于crash問題我一般都是先看crash的報錯,再查看堆棧信息,基本70%的crash問題都可以通過查看堆棧信息來定位,剩下的我一般都是結合log或者調(diào)試工具一起看。


        有的時候crash不會穩(wěn)定出現(xiàn)在某個地方,這種調(diào)試起來比較麻煩,一般都是某塊內(nèi)存出了問題,比如某個對象其實是構造在0x123456地址上,但是我們卻使用了0x234567地址來調(diào)用對象上的相關函數(shù),這種會導致crash,但是不一定每次都crash在相同的地方,這就需要像二分法一樣,分段排查錯誤,縮小復現(xiàn)范圍,然后利用調(diào)試工具或log打印某些變量的地址以及變量值等,進而排查問題。


        也可通過解core來排查問題,我一般解core都是通過gdb,有的大佬可以非常專業(yè)高端的解core,這我基本不怎么了解。。。我主要是做移動端native開發(fā),平時項目中基本用不到解core這種方式。而且現(xiàn)在經(jīng)常使用XCode調(diào)試,真的相當方便。



        如何調(diào)試邏輯問題?



        對于邏輯問題我一般都是打log,也建議大家平時開發(fā)過程中在一些關鍵的地方都打上log,開發(fā)過程中可能比較麻煩,但如果真的出了邏輯性的問題,而且又不是穩(wěn)定復現(xiàn),又沒有對應的log信息,那真的相當麻煩。所以老鐵們,多打log,不要嫌麻煩,log在關鍵時刻能起很大作用。


        當然邏輯問題也可以使用gdb或者lldb打斷點的方法來調(diào)試,在某些關鍵地方打上斷點,然后查看某些變量的值,也可以使用某些IDE調(diào)試,我一般使用XCode來打斷點進行調(diào)試。但這種方法有個缺點,如果程序Release出去后出現(xiàn)了邏輯問題,調(diào)試起來就比較麻煩,所以建議還是多打一些log。



        如何調(diào)試內(nèi)存問題?



        內(nèi)存問題常見的就是內(nèi)存泄漏啦,關于內(nèi)存泄漏我一般都是先寫個自己的內(nèi)存檢測的小工具用在項目中,C語言的話那就用宏覆蓋malloc和free函數(shù),C++的話那就重寫operator new 和 operator delete函數(shù),這里可以看我之前寫過的文章我擼了個內(nèi)存泄漏檢測工具,只用了兩招


        關于內(nèi)存問題還有兩個重磅調(diào)試工具要推薦,valgrind和asan,valgrind想必大家都知道也都用過,其實大家也可以多用下asan,它是gcc自帶的工具,非常方便,關于asan可以看我這篇文章Linux如何調(diào)試內(nèi)存泄漏



        如何調(diào)試死鎖問題?



        如果合理使用C++11的RAII風格的鎖或者更現(xiàn)代的std::scope_lock,那基本不會發(fā)生死鎖。但如果真發(fā)生了死鎖,怎么調(diào)試呢?可以使用IDE直接查看當前各個線程的堆棧信息,看哪兩個線程處在wait狀態(tài),那基本上是這兩個線程發(fā)生了死鎖。


        還可以使用gdb+deadlock.py的方式,deadlock.py是個檢測死鎖的python腳本,可以在gdb中執(zhí)行,如果真的發(fā)生了死鎖,直接執(zhí)行腳本就可以檢測出來,代碼太長不好貼出來,deadlock.py的代碼和使用方式,可以后臺回復deadlock獲取。



        如何進行性能分析?



        關于性能分析我其實更多的還是在代碼中打印函數(shù)耗時,關于怎么優(yōu)雅的打印函數(shù)耗時可以移步這里RAII妙用之計算函數(shù)耗時。再推薦個性能分析的工具,gperftools,這個工具是Google出品,可以提供整個程序的熱點分布圖,方便我們找到性能的瓶頸。




        如何寫可靠的代碼?



        想要寫好代碼,做好靜態(tài)檢測是必須的,它可以按照某些設定好的代碼規(guī)則,幫助我們檢測代碼的潛在缺陷,找到代碼中隱藏的錯誤,比如參數(shù)不匹配、有歧義的嵌套語句、錯誤的遞歸、非法計算、空指針問題、越界問題、未初始化問題、內(nèi)存泄漏問題等等。這里推薦個工具Clang-Tidy,還有個代碼檢測的平臺叫SonarCube,也非常好用。具體可以看:這么多性能調(diào)優(yōu)工具,看看你知道幾個?




        如何打log?



        C++里想打log基本上都會使用log庫,有些大佬是自己擼的,有的是使用第三方庫,我工作中更多用到的是glog,glog挺好用,但它性能較低,這里推薦使用spdlog,spdlog基本是現(xiàn)代C++中最火的一個第三方log庫,功能完備,性能較高,值得推薦。



        如何進行網(wǎng)絡調(diào)試


        不用多說,tcpdump+wireshark。



        如何進行單元測試?



        也不用多說,直接上gtest吧。這里強調(diào)一下,盡量寫代碼之前先寫好測試用例,先想好怎么測試后再開始動手寫代碼。


        歐了,打完收工。


        瀏覽 21
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            免费又黄又爽的禁片 | 欧美+国产+无码+麻豆 | 爱搞搞就搞搞网站 | 天天干狠狠操 | 国产又粗又猛又爽 | 伊人久久艹 | 91精品黄色 | 国产精品15p | 欧美午夜精品福利 | 国产高清一级毛片在线不卡 |