1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD:好吧GDB。 3 00:00:06,830 --> 00:00:08,480 究竟是什麼? 4 00:00:08,480 --> 00:00:11,310 所以GDB,它代表 對於GNU調試器, 5 00:00:11,310 --> 00:00:15,040 是一個真正真棒工具,我們就可以 用它來幫助我們調試我們的節目, 6 00:00:15,040 --> 00:00:18,210 或者找出事情 在我們的計劃去錯了。 7 00:00:18,210 --> 00:00:22,590 GDB令人驚訝的是強大的,但 輸出和交互與它 8 00:00:22,590 --> 00:00:23,830 可以是一個有點神秘。 9 00:00:23,830 --> 00:00:28,210 這通常是一個命令行工具, 它會向你扔了很多信息。 10 00:00:28,210 --> 00:00:31,144 它可以一種很難 解析究竟發生了什麼。 11 00:00:31,144 --> 00:00:33,560 幸運的是,我們已經採取措施 要解決這個問題為您 12 00:00:33,560 --> 00:00:36,281 你通過CS50工作。 13 00:00:36,281 --> 00:00:39,030 如果您沒有使用圖形 調試器,我的同事丹 14 00:00:39,030 --> 00:00:41,570 Armandarse發話了相當 視頻中的一些有關這個 15 00:00:41,570 --> 00:00:44,740 應該在這裡 現在,你可能需要 16 00:00:44,740 --> 00:00:48,270 使用這些命令行 工具與GDB工作。 17 00:00:48,270 --> 00:00:51,250 如果你工作在CS50 IDE,你並不需要這樣做。 18 00:00:51,250 --> 00:00:53,550 但是,如果你不 在CS50 IDE中工作, 19 00:00:53,550 --> 00:00:55,750 也許使用一個版本 CS50電器, 20 00:00:55,750 --> 00:00:58,860 或其他Linux操作系統 系統GDB安裝就可以了, 21 00:00:58,860 --> 00:01:00,980 您可能需要使用 這些命令行工具。 22 00:01:00,980 --> 00:01:02,860 >> 而且因為你可能 要做到這一點,它的 23 00:01:02,860 --> 00:01:06,280 有用的只是為了了解 GDB工作的命令行。 24 00:01:06,280 --> 00:01:09,650 但同樣,如果你 使用CS50 IDE,你 25 00:01:09,650 --> 00:01:15,400 可以使用圖形化調試器 內置於在IDE。 26 00:01:15,400 --> 00:01:18,750 因此,要得到的東西去與 GDB,開始調試 27 00:01:18,750 --> 00:01:21,220 的一個特定的過程 程序,所有你需要做的 28 00:01:21,220 --> 00:01:23,810 類型是GDB跟隨 由程序名稱。 29 00:01:23,810 --> 00:01:28,620 因此,舉例來說,如果你的程序是 你好,你可以鍵入GDB打招呼。 30 00:01:28,620 --> 00:01:31,210 >> 當你這樣做,你會 拉上了GDB的環境。 31 00:01:31,210 --> 00:01:33,800 您提示會發生變化, 而不是被它通常 32 00:01:33,800 --> 00:01:35,841 當你輸入的東西是 在命令line-- LS, 33 00:01:35,841 --> 00:01:38,115 cd--所有典型的 Linux命令,你的提示 34 00:01:38,115 --> 00:01:42,200 將變更為,也許事情 像括號GDB括號。 35 00:01:42,200 --> 00:01:46,630 這是你的新的GDB提示,因為 你GDB的環境中。 36 00:01:46,630 --> 00:01:49,830 一旦環境的內部, 有兩個主要的命令 37 00:01:49,830 --> 00:01:52,290 你可能會使用 按照以下順序。 38 00:01:52,290 --> 00:01:55,200 >> 第一個是b,即 短暫的休息。 39 00:01:55,200 --> 00:01:58,690 而你輸入b後,您通常 鍵入一個函數的名稱, 40 00:01:58,690 --> 00:02:01,040 或者,如果你碰巧知道 圍繞什麼,行號 41 00:02:01,040 --> 00:02:04,100 你的程序開始 表現得有點怪異, 42 00:02:04,100 --> 00:02:06,370 你可以鍵入一行 一些有作為。 43 00:02:06,370 --> 00:02:09,660 什麼B,或者休息,不 是它可以讓你的程序 44 00:02:09,660 --> 00:02:13,270 運行,直到某一點, 的功能,即,名稱 45 00:02:13,270 --> 00:02:15,880 您指定或線 您指定的號碼。 46 00:02:15,880 --> 00:02:18,590 >> 在這一點上,它 將凍結執行。 47 00:02:18,590 --> 00:02:21,670 這是一個非常好的事情,因為 一旦執行已經被凍結, 48 00:02:21,670 --> 00:02:25,214 你可以開始很慢 逐步執行程序。 49 00:02:25,214 --> 00:02:28,130 通常情況下,如果你已經運行 你的程序,他們非常短。 50 00:02:28,130 --> 00:02:31,250 通常情況下,你鍵入點斜線什麼 你的程序的名稱,敲回車, 51 00:02:31,250 --> 00:02:33,470 之前,你可以眨眼,你 程序已經完成。 52 00:02:33,470 --> 00:02:36,620 這不是一個真正的大量的時間去嘗試 並找出什麼錯誤。 53 00:02:36,620 --> 00:02:40,920 因此,它真的能放緩的東西 下降設置一個破發點與B, 54 00:02:40,920 --> 00:02:43,040 然後加緊研究。 55 00:02:43,040 --> 00:02:46,169 >> 然後,一旦你已經設置的斷點 一點,就可以運行該程序。 56 00:02:46,169 --> 00:02:47,960 如果您有任何 命令行參數, 57 00:02:47,960 --> 00:02:51,610 在此指定他們,而不是當 您鍵入GDB的程序名。 58 00:02:51,610 --> 00:02:55,980 您可以指定所有的命令行 通過採取R或運行參數, 59 00:02:55,980 --> 00:03:00,270 然後任何命令行參數 你需要你的程序中。 60 00:03:00,270 --> 00:03:03,510 還有一些其他的真 重要的和有用的命令 61 00:03:03,510 --> 00:03:04,970 內生產總值的環境。 62 00:03:04,970 --> 00:03:07,540 所以,讓我迅速 去了其中的一些。 63 00:03:07,540 --> 00:03:11,320 >> 第一是n,這是短的下一個, 您可以鍵入的下一個替代N, 64 00:03:11,320 --> 00:03:12,304 這兩個會的工作。 65 00:03:12,304 --> 00:03:13,470 而這僅僅是速記。 66 00:03:13,470 --> 00:03:17,540 正如你可能已經得到了 習慣了,能夠類型的東西 67 00:03:17,540 --> 00:03:20,520 短一般是更好的。 68 00:03:20,520 --> 00:03:24,100 而且它會做的是,它會 向前一步一個塊的代碼。 69 00:03:24,100 --> 00:03:26,170 因此它會繼續前進 直到一個函數調用。 70 00:03:26,170 --> 00:03:28,350 然後,而不是 潛入該函數 71 00:03:28,350 --> 00:03:33,130 而經歷了這一切功能 代碼,它只是具備的功能。 72 00:03:33,130 --> 00:03:34,400 >> 該函數將被調用。 73 00:03:34,400 --> 00:03:35,733 它會做任何的工作。 74 00:03:35,733 --> 00:03:38,870 它會返回一個值, 調用它的功能。 75 00:03:38,870 --> 00:03:42,490 然後你就移動到 下一行調用函數的。 76 00:03:42,490 --> 00:03:44,555 如果你想一步 函數的內部, 77 00:03:44,555 --> 00:03:46,430 而不是僅僅有 它執行,特別是 78 00:03:46,430 --> 00:03:50,004 如果你認為問題 可能在於該函數中, 79 00:03:50,004 --> 00:03:52,670 你可以,當然,設置斷點 點那個函數內。 80 00:03:52,670 --> 00:03:57,820 或者,如果你已經在運行,你可以 使用s到一步向前一行代碼。 81 00:03:57,820 --> 00:04:01,170 >> 因此,這將介入 並潛入功能, 82 00:04:01,170 --> 00:04:04,750 而不是只具有執行 而在功能上繼續 83 00:04:04,750 --> 00:04:07,380 你是為了調試。 84 00:04:07,380 --> 00:04:09,870 如果你想知道 一個變量的值, 85 00:04:09,870 --> 00:04:12,507 您可以鍵入p或打印, 然後將變量名。 86 00:04:12,507 --> 00:04:15,090 這將打印出來給你, GDB的環境的內部, 87 00:04:15,090 --> 00:04:19,110 的變量的名稱,即你 - 原諒我 - 的變量的值 88 00:04:19,110 --> 00:04:20,064 您已經命名。 89 00:04:20,064 --> 00:04:23,230 如果你想知道每一個的值 從那裡局部變量訪問 90 00:04:23,230 --> 00:04:25,970 你現在在你的 程序,您可以鍵入信息當地人。 91 00:04:25,970 --> 00:04:28,332 它比快很多 鍵入p和再不管, 92 00:04:28,332 --> 00:04:30,540 列出了所有的 你知道存在變數。 93 00:04:30,540 --> 00:04:34,370 您可以輸入信息的當地人,並 將打印出你的一切。 94 00:04:34,370 --> 00:04:37,770 接下來是BT,這是 短的回溯。 95 00:04:37,770 --> 00:04:41,680 現在,一般地, 在CS50特別早, 96 00:04:41,680 --> 00:04:44,450 你不會真的有機會 使用BT或回溯追踪, 97 00:04:44,450 --> 00:04:47,860 因為你沒有的功能 調用等功能。 98 00:04:47,860 --> 00:04:50,450 >> 你可能有主呼叫 功能,但是這可能是它。 99 00:04:50,450 --> 00:04:53,199 你沒有其他的功能 調用另一個函數,該函數 100 00:04:53,199 --> 00:04:54,880 調用另一個函數,等等。 101 00:04:54,880 --> 00:04:57,550 但隨著你的程序得到更多的 複雜,並且特別 102 00:04:57,550 --> 00:05:00,290 當你開始工作 遞歸,回溯追踪 103 00:05:00,290 --> 00:05:05,150 可以讓你真正有用的方法 那種得到一些上下文哪裡 104 00:05:05,150 --> 00:05:06,460 我在我的計劃。 105 00:05:06,460 --> 00:05:10,590 所以說,你寫你的代碼, 你知道,主調用一個函數 106 00:05:10,590 --> 00:05:14,720 f,這個調用一個函數 克,它調用一個函數h。 107 00:05:14,720 --> 00:05:17,650 因此,我們有幾層 嵌套回事。 108 00:05:17,650 --> 00:05:19,440 >> 如果你是內 您的GDB的環境, 109 00:05:19,440 --> 00:05:21,640 你知道你的內 h的,但你忘了 110 00:05:21,640 --> 00:05:27,210 關於什麼讓你到你 are--您可以鍵入BT或回溯追踪, 111 00:05:27,210 --> 00:05:32,370 它會打印出H,G,F為主, 沿著一些其它的信息,這 112 00:05:32,370 --> 00:05:35,984 為您提供了一個線索,確定主 所謂的F,F稱為G,G稱為H, 113 00:05:35,984 --> 00:05:37,900 而這也正是我 目前我在我的計劃。 114 00:05:37,900 --> 00:05:41,380 因此,它可以是真正有用的, 尤其是在神秘的煩躁GDB的 115 00:05:41,380 --> 00:05:45,667 變得有點勢不可擋,以 找出到底是那裡的東西。 116 00:05:45,667 --> 00:05:48,500 最後,當你的程序完成後, 或者當你完成調試它 117 00:05:48,500 --> 00:05:50,125 並且要一步之遙 從GDB的環境, 118 00:05:50,125 --> 00:05:51,940 它有助於了解如何擺脫它。 119 00:05:51,940 --> 00:05:55,500 您可以鍵入q,或退出,讓出。 120 00:05:55,500 --> 00:05:59,220 現在,今天的視頻前 我準備了一個錯誤的程序 121 00:05:59,220 --> 00:06:03,900 所謂buggy1,這是我編 從被稱為buggy1.c一個文件。 122 00:06:03,900 --> 00:06:06,500 如你所料,此 節目其實是在馬車。 123 00:06:06,500 --> 00:06:08,990 不順心的事 當我嘗試並運行它。 124 00:06:08,990 --> 00:06:13,014 現在,不幸的是,我無意間 刪除了我的buggy1.c文件, 125 00:06:13,014 --> 00:06:15,930 所以為了讓我弄清楚 什麼錯這個程序, 126 00:06:15,930 --> 00:06:18,770 我將不得不使用 GDB那種盲目的,想 127 00:06:18,770 --> 00:06:22,372 瀏覽該程序 弄清楚到底發生了什麼錯誤。 128 00:06:22,372 --> 00:06:24,580 但僅使用工具 我們已經了解了, 129 00:06:24,580 --> 00:06:27,700 我們幾乎可以圖 出它到底是什麼。 130 00:06:27,700 --> 00:06:30,740 因此,讓我們頭以上 CS50 IDE,看一看。 131 00:06:30,740 --> 00:06:33,155 好了,我們在這裡在我 CS50 IDE環境, 132 00:06:33,155 --> 00:06:35,697 我會放大一點點 所以你可以看到多一點。 133 00:06:35,697 --> 00:06:38,530 在我的終端窗口中,如果我列出 我的現任董事的內容 134 00:06:38,530 --> 00:06:41,250 使用ls,我們會看到,我 有幾個源文件 135 00:06:41,250 --> 00:06:44,982 這裡,包括 前面討論buggy1。 136 00:06:44,982 --> 00:06:46,940 究竟推移,當 我嘗試運行buggy1。 137 00:06:46,940 --> 00:06:47,773 那麼讓我們來了解一下。 138 00:06:47,773 --> 00:06:52,510 I型點斜線, 越野車,和我打回車鍵。 139 00:06:52,510 --> 00:06:53,670 >> 段故障。 140 00:06:53,670 --> 00:06:55,000 這不是很好。 141 00:06:55,000 --> 00:06:57,180 如果你還記得,一 段錯誤通常 142 00:06:57,180 --> 00:07:01,540 當我們訪問內存時 我們正在不許碰。 143 00:07:01,540 --> 00:07:03,820 我們已經在某種程度上達成 的範圍之外 144 00:07:03,820 --> 00:07:05,995 什麼樣的程序,在 編譯器,給了我們。 145 00:07:05,995 --> 00:07:08,310 因此已經,這是一個 線索保持在工具箱中 146 00:07:08,310 --> 00:07:10,660 當我們開始調試過程。 147 00:07:10,660 --> 00:07:13,620 一些曾在這裡得有點不對。 148 00:07:13,620 --> 00:07:15,935 >> 好吧,讓我們開始 了GDB環境 149 00:07:15,935 --> 00:07:19,030 看看我們是否能想出 究竟是什麼問題。 150 00:07:19,030 --> 00:07:21,674 我要明確我的屏幕, 我要去鍵入GDB 151 00:07:21,674 --> 00:07:24,340 再次,進入GDB的環境, 和節目的名稱 152 00:07:24,340 --> 00:07:27,450 我想調試,buggy1。 153 00:07:27,450 --> 00:07:30,182 我們得到一點消息,讀 從buggy1符號,完成。 154 00:07:30,182 --> 00:07:32,390 所有這一切意味著它拉 同時所有的代碼, 155 00:07:32,390 --> 00:07:35,570 而現在它已經裝入 GDB,它已經準備好去。 156 00:07:35,570 --> 00:07:37,140 >> 現在,我想幹什麼? 157 00:07:37,140 --> 00:07:39,130 你還記得什麼 第一個步驟通常是 158 00:07:39,130 --> 00:07:42,540 我這個環境裡面之後? 159 00:07:42,540 --> 00:07:44,540 但願你說的設置 一個破發點,因為 160 00:07:44,540 --> 00:07:46,240 其實這就是我想做的事情。 161 00:07:46,240 --> 00:07:47,990 現在,我沒有 這個源代碼 162 00:07:47,990 --> 00:07:50,948 在我的面前,這可能是 不是典型的用例,順便說一句。 163 00:07:50,948 --> 00:07:52,055 你可能會。 164 00:07:52,055 --> 00:07:52,680 所以這是很好的。 165 00:07:52,680 --> 00:07:55,790 但是,假設你不這樣做,有什麼 一個功能,你知道 166 00:07:55,790 --> 00:07:58,880 在每一個C程序的存在? 167 00:07:58,880 --> 00:08:04,420 無論多麼大或多麼複雜 它是,該功能肯定存在。 168 00:08:04,420 --> 00:08:05,440 主,對不對? 169 00:08:05,440 --> 00:08:08,870 >> 所以沒有一切,我們可以 設置在主一個破發點。 170 00:08:08,870 --> 00:08:12,200 再次,我可以只輸入 打破代替b為主。 171 00:08:12,200 --> 00:08:14,650 如果你很好奇,如果你 曾經鍵入了一個長的命令 172 00:08:14,650 --> 00:08:16,800 然後意識到,你 輸入了錯誤的事情, 173 00:08:16,800 --> 00:08:18,770 你想擺脫 一切正如我剛才那樣, 174 00:08:18,770 --> 00:08:22,029 你可以採取控制U,這將 刪除一切,帶給你回來 175 00:08:22,029 --> 00:08:23,570 到光標線的開頭。 176 00:08:23,570 --> 00:08:26,569 快了很多不僅僅是按住 刪除或打它一幫倍 177 00:08:26,569 --> 00:08:27,080 過來。 178 00:08:27,080 --> 00:08:28,740 >> 因此,我們將設置一個破發點,在主。 179 00:08:28,740 --> 00:08:32,970 正如你所看到的,它說我們已經 設置一個斷點在文件buggy1.c, 180 00:08:32,970 --> 00:08:36,330 顯然在第一線 的主要代碼行七人。 181 00:08:36,330 --> 00:08:38,080 再次,我們沒有 這裡源文件, 182 00:08:38,080 --> 00:08:40,429 但我認為這是 告訴我真相。 183 00:08:40,429 --> 00:08:44,510 然後,我只是想 並運行程序,河 184 00:08:44,510 --> 00:08:45,360 啟動程序。 185 00:08:45,360 --> 00:08:48,160 好了,所以這條消息 是有點神秘。 186 00:08:48,160 --> 00:08:50,160 但基本上什麼 發生在這裡它只是 187 00:08:50,160 --> 00:08:53,350 告訴我,我已經打了我突破 點,斷點1號。 188 00:08:53,350 --> 00:08:55,877 >> 然後,該代碼行, 沒有這樣的文件或目錄。 189 00:08:55,877 --> 00:08:57,710 唯一的原因, 我看到這個信息 190 00:08:57,710 --> 00:09:00,800 是因為我無意中 刪除了我的buggy.c文件。 191 00:09:00,800 --> 00:09:04,050 如果我的buggy1.c文件存在 在當前的目錄中, 192 00:09:04,050 --> 00:09:06,920 該行那裡實際上 告訴我的代碼行 193 00:09:06,920 --> 00:09:08,214 從字面上讀。 194 00:09:08,214 --> 00:09:09,380 不幸的是,我將其刪除。 195 00:09:09,380 --> 00:09:14,790 我們將不得不樣的導航 通過這個有點盲目。 196 00:09:14,790 --> 00:09:17,330 >> 好了,讓我們來看看,有什麼 我想在這裡做? 197 00:09:17,330 --> 00:09:21,770 好吧,我想知道是什麼地方 變量可能是提供給我。 198 00:09:21,770 --> 00:09:23,570 我開始了我的計劃。 199 00:09:23,570 --> 00:09:28,515 讓我們來看看可能是什麼 已經初始化我們。 200 00:09:28,515 --> 00:09:31,430 I型信息當地人,沒有本地人。 201 00:09:31,430 --> 00:09:33,960 好吧,使之不 給我一噸的信息。 202 00:09:33,960 --> 00:09:37,600 我可以嘗試,並打印出一個變量, 但我不知道任何變量名。 203 00:09:37,600 --> 00:09:39,930 我可以嘗試一回痕跡, 但我的主內, 204 00:09:39,930 --> 00:09:43,710 所以我知道我沒有作 另一個函數調用現在。 205 00:09:43,710 --> 00:09:47,710 >> 所以看起來像我的唯一選項 使用N或左右,開始潛水研究。 206 00:09:47,710 --> 00:09:49,630 我會用了N。 207 00:09:49,630 --> 00:09:51,180 所以我N型。 208 00:09:51,180 --> 00:09:53,060 噢,我的天哪,這裡究竟是怎麼回事。 209 00:09:53,060 --> 00:09:56,260 程序接收到的信號, SIGSEGV段故障, 210 00:09:56,260 --> 00:09:57,880 然後一大堆東西。 211 00:09:57,880 --> 00:09:58,880 我已經不堪重負。 212 00:09:58,880 --> 00:10:00,980 嗯,實際上是一個 很多問題需要了解。 213 00:10:00,980 --> 00:10:02,520 那麼,這告訴我們什麼? 214 00:10:02,520 --> 00:10:09,180 它告訴我們的是,這個計劃是 約而至,但還沒有,賽格故障。 215 00:10:09,180 --> 00:10:12,550 特別是,我要去 放大甚至進一步這裡, 216 00:10:12,550 --> 00:10:18,980 它是關於賽格故障有關 所謂的strcmp。 217 00:10:18,980 --> 00:10:22,705 >> 現在,我們可能還沒有討論 這一功能廣泛。 218 00:10:22,705 --> 00:10:25,580 但is--,因為我們不打算 說說每個功能 219 00:10:25,580 --> 00:10:28,610 存在於C標準library-- 但他們都提供給你, 220 00:10:28,610 --> 00:10:32,110 特別是如果你把一個 看reference.cs50.net。 221 00:10:32,110 --> 00:10:35,000 而STRCMP是一個真正強大 功能存在內 222 00:10:35,000 --> 00:10:38,070 該文件string.h頭的 文件,這是一個標頭 223 00:10:38,070 --> 00:10:41,970 專用於功能的文件 與工作和處理字符串。 224 00:10:41,970 --> 00:10:49,830 >> 特別是,是什麼的strcmp確實是 它比較兩個字符串的值。 225 00:10:49,830 --> 00:10:54,160 所以我要段錯誤 在通話中對strcmp好像。 226 00:10:54,160 --> 00:10:58,530 我打了N,而事實上我得到的消息, 方案終止信號SIGSEGV 227 00:10:58,530 --> 00:11:01,370 段故障。所以,現在 其實,我賽格故障, 228 00:11:01,370 --> 00:11:06,479 而我的方案有相當 很多有效的放棄。 229 00:11:06,479 --> 00:11:07,770 這是程序的結束。 230 00:11:07,770 --> 00:11:10,370 它打破了,它墜毀。 231 00:11:10,370 --> 00:11:14,740 所以,是不是很多,但我 實際上確實學到了不少 232 00:11:14,740 --> 00:11:16,747 從這一點經驗。 233 00:11:16,747 --> 00:11:17,580 我學到了? 234 00:11:17,580 --> 00:11:22,020 好了,我的程序崩潰 立刻漂亮多了。 235 00:11:22,020 --> 00:11:26,300 我的程序崩潰的 一個打電話給strcmp,但我 236 00:11:26,300 --> 00:11:30,560 沒有在任何局部變量我 計劃在它崩潰的時間。 237 00:11:30,560 --> 00:11:37,320 那麼,什麼串,或字符串, 可能我可能會比較。 238 00:11:37,320 --> 00:11:42,140 如果我沒有任何地方 變量,你可能 239 00:11:42,140 --> 00:11:45,520 推測,我have--有可能是一個 全局變量,這可能是正確的。 240 00:11:45,520 --> 00:11:47,670 >> 但總體來說,這似乎 像我比較 241 00:11:47,670 --> 00:11:52,070 到不存在的東西。 242 00:11:52,070 --> 00:11:54,130 因此,讓我們探討 一個遠一點。 243 00:11:54,130 --> 00:11:55,120 所以,我要明確我的屏幕。 244 00:11:55,120 --> 00:11:57,536 我要離開了的 GDB環境一秒鐘。 245 00:11:57,536 --> 00:12:01,300 而且我想,OK,所以有 沒有局部變量,在我的計劃。 246 00:12:01,300 --> 00:12:06,444 我不知道,也許我應該傳球 在一個字符串作為命令行參數。 247 00:12:06,444 --> 00:12:07,610 因此,讓我們只是測試了這一點。 248 00:12:07,610 --> 00:12:09,020 我以前沒有這樣做過。 249 00:12:09,020 --> 00:12:14,244 >> 讓我們來看看,也許,如果我運行這個程序 使用命令行參數它的工作原理。 250 00:12:14,244 --> 00:12:16,140 呵呵,不分段錯誤存在。 251 00:12:16,140 --> 00:12:17,870 它只是告訴我,我想它了。 252 00:12:17,870 --> 00:12:19,170 所以,也許這就是固定在這裡。 253 00:12:19,170 --> 00:12:27,560 事實上,如果我回去看看 對於buggy1.c實際的源代碼, 254 00:12:27,560 --> 00:12:31,180 它好像我在做什麼是 我在做一個呼叫而不對strcmp 255 00:12:31,180 --> 00:12:34,010 檢查是否實際上的argv [1]存在。 256 00:12:34,010 --> 00:12:36,730 這實際上是 源代碼buggy1.c。 257 00:12:36,730 --> 00:12:38,855 所以我真的需要 在這裡做修復我的程序, 258 00:12:38,855 --> 00:12:40,835 假設我有 在我面前的文件,是 259 00:12:40,835 --> 00:12:44,740 只需添加一個檢查,以 確保的argc等於2。 260 00:12:44,740 --> 00:12:47,780 所以這個例子中,再次,就像我說的, 是有點做作,對吧? 261 00:12:47,780 --> 00:12:49,840 你一般都不會去 不小心刪除你的源代碼 262 00:12:49,840 --> 00:12:51,820 然後還要嘗試 和調試程序。 263 00:12:51,820 --> 00:12:53,120 但我們希望,它給了 您的說明 264 00:12:53,120 --> 00:12:55,120 這樣的東西那 你可能會想 265 00:12:55,120 --> 00:12:56,610 為你調試程序。 266 00:12:56,610 --> 00:12:58,760 >> 什麼是事務在這裡的狀態呢? 267 00:12:58,760 --> 00:13:00,510 什麼變量做我 有接近我? 268 00:13:00,510 --> 00:13:03,600 具體在哪裡我的計劃 崩潰,在哪一行, 269 00:13:03,600 --> 00:13:05,240 什麼調用什麼功能? 270 00:13:05,240 --> 00:13:06,952 什麼樣的線索,這是否能給我嗎? 271 00:13:06,952 --> 00:13:08,910 而這也正是 一種心態,你 272 00:13:08,910 --> 00:13:12,820 應該進入,當你 想著調試程序。 273 00:13:12,820 --> 00:13:13,820 >> 我是道格·勞埃德。 274 00:13:13,820 --> 00:13:16,140 這是CS50。 275 00:13:16,140 --> 00:15:08,642