如何除錯?
單步跟蹤是最常見的除錯方法,不過我用的極少,因為效率低。往往也不需要用到這個。接下來我寫的幾種常見的除錯方式, 主要針對Go和Python。按難度從容易到難,按效率從高到低。
以下所有的除錯的前提都是找到復現方式
- 標準輸出+日誌
一般日誌都可以設定級別,一般都會有例如debug
,info
,error
,fatal
等級別。將日誌輸出到標準輸出,在找到
復現方式之後就可以看日誌,然後定位問題。不過日誌除錯有一個問題,如果日誌列印太多,容易把真正出問題的地方掩蓋掉,
如果太少了,又不夠詳細導致不方便除錯。給日誌設定不同的級別更多的是一門手藝活,憑個人品味,經驗。
print也算一種,不過顯然logging是更科學的方式。
- 列印呼叫棧
如果光看日誌看不出來,可以用各種方式到異常點,看當前棧的情況,包括呼叫棧,變數等。比如Python中的異常,可以直接logging.exception
列印,Go的panic也可以runtime/debug
中的printstack打印出來。這種情況下一般配合異常收集
工具比如sentry
等,可以方便快速的定位問題
- review 程式碼
通常結合上面的兩步一起來,我個人一般到第一二步就知道問題所在了。如果還是不行,就會重讀一遍程式碼,在大腦裡模擬 處理的走向。
- 檢視APM
如果有使用APM工具,可以到其dashboard看,從大局看問題所在,然後結合上面兩種方式逐層細化下去。
- 單步跟蹤
單步跟蹤很強大,但是通常用不上。普通的除錯走單步,實在是有種大炮打蚊子的感覺。常見的除錯工具是pdb(Python),gdb(Go)。