> For the complete documentation index, see [llms.txt](https://jen-hsuan-hsieh.gitbook.io/debugging-tools-experience/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jen-hsuan-hsieh.gitbook.io/debugging-tools-experience/42zhui-zong-cheng-shi-zhi-xing/41zhao-chu-cuo-wu-fa-sheng-de-lai-yuan.md).

# 1.1.找出錯誤來源

## 1.Debug的第一步: 找出問題的來源

* 當面對一個從沒見過的issue, 最困難的在於不知從何開始下手
  * 必須先知道對手(問題發生的源頭)在哪

## 2.做法

* 1.複製問題
  * 在開始追蹤前, 問題要先可以被隨心所欲地重現
  * 製作最小化的測試範例
* 2.推測問題的來源
  * 以將**問題發生點限縮到某次git commit**為目標
    * 用git checkout到先前的commit以確定問題的出現
      * 確定問題是因為這次的change, 還是這個問題本來就一直存在
    * 用git bisect來找出問題開始發生的commit
      * 如果確定此問題是在某個coomit後出現的, 但是不確定是從哪個commit後出現的, 可以用git bisect來找出該commit
  * 以**將問題發生點限縮到某個fuction**為目標
    * 用UI的文字, console或是log上的訊息來推測程式在何處中斷:
      * 1.Exception message
        * 可以透過網路搜尋以推測出Exception的原因, 並進一步推斷出大概做什麼動作時出現問題
      * 2.Print message
        * Print message通常是開發人員為了作為除錯時的依據所留下, 可以利用print出來的字串搜尋原始碼, 看看原始碼中哪一段有print此message的動作, 藉此定位問題的發生位置
        * 以Visual studio的C++/C#專案為例, 如果在多處都有print相同訊息則可以用[中斷點](https://jenhsuan.gitbooks.io/debugging-tools-experience/content/chapter4-fu-zhi-wen-ti-de-ji-qiao/42zhui-zong-cheng-shi-zhi-xing/422chu-cuo-gong-ju/4221shu-chudebug-xun-606f3a-visual-studio.html)在全部的可能處, 讓錯誤重現看程式中斷在何處
      * 3.若問題是crash:
        * 用[核心傾印](https://jenhsuan.gitbooks.io/debugging-tools-experience/content/chapter2-tracewen-ti-de-ji-qiao/21he-xin-qing-yin.html)可以收斂到**出現問題的函式**
    * 向下搜尋
      * 當問題已經被縮小到某個function, 裡面又呼叫了許多了子function, 必須確定問題是在哪個子function出現, 可以搭配下面的方法:
        * print
        * write log
        * 註解掉
