debug覆盤

首先是簡單的經驗

  1. 不要用array[0]來判斷空數組,有可能array[0]是null/undefined而後面有東西

Dec-25th-2017

項目中的google-map中的map.fitbounds(bounds)很詭異:使用後地圖的center符合預期,而zoom該變的時候卻沒變。我進行了艱辛的debug,步驟如下:

  • 比對能正常工作的demo
  • 把相關代碼從上述demo考到當前文件中試驗,結果工作正常 => fitbounds沒有打錯字或者參數錯誤。
  • 一步步註釋掉所有和fitbounds無關的代碼,進一步縮小範圍。
  • 最後鎖定到這句google.maps.event.clearInstanceListeners(window.map);,也就是說,當你清除了map上的所有事件,fitbounds就不再正常工作了,what the hell?
  • 前後花了相當多的時間和精力,回頭看看,如果憑感覺找,誰能猜到是這句呢?看來應該規範化debug流程,總結一些套路,這對於提高效率大有裨益。
  • 之後又出了個問題,收起ul的icon會導致地圖右邊出現空白,fitbounds解決不了,看了陳亮大佬的代碼找到了解決方法:google.maps.event.trigger(map, "resize");

Feb-21th-2018

  • 事情是這樣的,在做HTML簡歷時,我用onWheel事件觸發setState,觸發一次增加1,測試的時候卻每次都加2,百思不得其解,睡了一覺第二天早上很快就發現,onWheel事件在window上綁定了一次,在div上又綁定了一次,這樣觸發一次會加2.
  • 在做簡歷的其中一個組件(第三頁)時,一個處理數據的中間件函數對state中的數組用了shift方法,結果就是第一次渲染正常,從別的狀態切換回來時數據都沒了。純函數的好處由此可見。

May-03th-2018

  • B2B項目中,我寫好了一個拼合兩次異步操作數據的函數patchTable ,想把它import進組件時: import {patchTable} from '@/views/order/orderUtils' let patchTable = _.curry(patchTable )(this),報錯了:patchTable 爲undefined,檢查的結果令人沮喪,沒發現有啥錯誤。
  • 還好我讀過阮一峯的es6教程,我反應過來關鍵在於let關鍵字,它有變量提升效應,會在所有代碼運行前將該變量鎖死,任何賦值行爲都不允許,import自然也無法將函數導入變量patchTable,於是它從始至終都是undefined 。

May-30th-2018

  • 我試圖在一個vue組件的生命週期中使用console.log打印信息,但卻報錯。 原因在於我在該組件中註冊了一個叫console的自定義組件,這導致console的命名衝突

June-15th-2018

  • 使用new Promise()時,要記得用resolve來觸發fullfilled,而不是return

July-9th-2018

  • 不要用map來做forEach的工作,如果非做不可,記得return value。一旦鏈式調用map,且忘記return,必然導致失敗。

July-11th-2018

  • 寫複製流程功能時,FlowWraper類中已經有了clone方法,然後加了一個generator叫*clone,結果是generator被覆蓋,找了很久才發現。

September-13th-2018

  • 前端導出excel功能,增加一列(新增字段),新的一列死活出不來,但過程中的數據又都符合預期,於是我把目標限定在最後的輸出階段,如果有問題,這個問題一定會反應在輸出excel函數的參數中;傳遞給導出函數的數據有兩個:wb和wopts,我徹查了wb,果然發現了內部的ref字段是元兇。

Octobor-24th-2018

  • pull --upstream時出錯,直接reset --hard,直接退到了舊的一個版本,然後不停reset都找不到對的,最後大佬在reflog裏找commit 用checkout看事件找回.
  • git操作失誤的解決方法: 一. reflog reset --hard 二.兩個小時commit一次 三.實在找不回的時候用編輯器ctrl+z 四. 提交時一旦出現異常 先停下來理清思路 別急着reset

January-03th-2019

  • 由於gitlab改版,push的分支錯了,直接到了master

January-16th-2019

  • 開發chrome插件,目的是拿到當前頁面的url來判斷解析html的方法。
  • 一開始的方向就錯了:在content_script中獲取,每個iframe都會引入content_script,這導致url有多個,還有其他問題不再贅述。這浪費了大量的時間。
  • 之後突然想起chrome 在 background 中有提供獲取當前tab信息的API,目的達成
  • 另外在3月四日,張七星那邊登錄不了,經查是因爲當時提交後爲了之後的修改安全和方便把url換回了localhost,且默認url設置成了url.dev,而此時dev的url已被刪除。教訓:交付的代碼應至少臨時再檢查一次,且不應再因這種原因在完成後另改代碼,交付的代碼應是倉庫中的而不是本地的。

Feburary-22th-2019

  • 自定義度量編輯器

March-14th-2019

  • 一個純前端的bug測試服有,本地一樣的代碼卻沒有,於是test-build到本地,node . 用build出來的文件起本地服務器,發現沒有bug,於是線上重新build解決了線上問題。但後來本地npm run dev頁面卻變成了空白,原因是之前test-build時把windows的環境變量NODE_ENV永久設置爲"test",刪除該環境變量後恢復正常。教訓是最好設置暫時的環境變量。

March-15th-2019

  • 在react的componentWillReceiveProps中很容易犯的錯誤:該用nextProps的時候用了this.props,好幾次了,不要再犯。

April-1st-2019

  • 用 superagent 寫爬蟲抓取數據,網頁是用.NET apsx 寫的,查詢時發出 post 請求,表單含有四個有用字段和__VIEWSTATE __EVENTVALIDATION,其餘字段爲空,先是用postman照抄各字段,要麼超時,要麼返回報錯的html,而腳本抓取則要麼超時要麼報錯。後來發現腳本抓取的超時其實是結尾沒有打印響應的數據,實際上正確的數據已經返回。當然,這個錯誤很智障,分析過程可以得出以下經驗:postman要麼是我沒用熟要麼是有問題,參數格式都對卻結果與腳本和瀏覽器不同,下次涉及postman要更加多留個心眼,由於postman的結果經常出現超時,我對於腳本沒有反應的情況更加沒有懷疑而以爲是超時,更難注意到沒有打印這種低級錯誤(還有一個原因是之前每次500報錯,superagent都有打印報錯,我誤以爲是每次響應返回都有打印),其實後來也有嚴重懷疑是一個低級錯誤,但終究沒有發現。

July-23th-2019

  • 從前端 的 webpack-dev-server 用 http-proxy-middleware 代理到 後端 localhost:55007 接口, 卻一直 504(代理超時), 以爲是 http-proxy-middleware 配置的問題,但不是,想到可能是 hosts 的問題,但瀏覽器可以訪問 localhost,就覺得不應該,甚至用了 wireShark 抓包,也分析不出什麼,後來發現確實 /etc/hosts 被 ihosts 清空了,也就是 localhost 對 127.0.0.1 的映射關係是在 hosts 實現的,結論是這種能改 hosts 的軟件要小心使用,且瀏覽器識別 localhost 不依賴於 hosts 文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章