1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Hi, Tôi [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Hôm nay, chúng ta sẽ được xem xét gỡ lỗi. 4 00:00:04,410 --> 00:00:06,697 Không những chúng ta sẽ nói về một số kỹ thuật, 5 00:00:06,697 --> 00:00:09,280 nhưng cũng có thể chúng ta sẽ xem xét ở một số tính năng chứa 6 00:00:09,280 --> 00:00:14,170 trong IDE CS50 cho phép bạn dễ dàng gỡ lỗi một chương trình. 7 00:00:14,170 --> 00:00:16,272 >> Chỉ cần một ví dụ về một cái gì đó mà có thể đi sai 8 00:00:16,272 --> 00:00:18,730 và nó thực sự là một cái gì đó rằng chúng ta đã thấy trước đây. 9 00:00:18,730 --> 00:00:23,200 Trong trường hợp này, đây là một chương trình C chấp nhận một số nguyên từ người sử dụng, 10 00:00:23,200 --> 00:00:27,580 chia nó bằng hai, và cung cấp sản lượng trở lại cho người sử dụng. 11 00:00:27,580 --> 00:00:30,610 Bây giờ những gì chúng ta đã nhìn thấy trước đó trong bài giảng, 12 00:00:30,610 --> 00:00:34,370 chúng ta biết rằng điều này sẽ thực sự gây ra loại cụ thể của vấn đề phân chia 13 00:00:34,370 --> 00:00:35,860 khi chúng tôi có số lẻ. 14 00:00:35,860 --> 00:00:40,330 >> Cụ thể, chúng tôi sẽ chỉ vứt đi bất cứ điều gì sau dấu thập phân. 15 00:00:40,330 --> 00:00:43,170 Bây giờ, chúng ta biết rằng điều này xảy ra là các trường hợp. 16 00:00:43,170 --> 00:00:47,430 Và nếu chúng ta chạy nó, chúng ta có thể xác nhận nghi ngờ của chúng tôi, đầu tiên, bằng cách biên dịch. 17 00:00:47,430 --> 00:00:50,460 Và sau đó, bằng cách chạy và nhập một số lẻ. 18 00:00:50,460 --> 00:00:51,720 >> Điều này không có gì mới. 19 00:00:51,720 --> 00:00:54,490 Nhưng điều này thực sự là một ví dụ về một lỗi 20 00:00:54,490 --> 00:00:58,810 có thể tồn tại trong một chương trình lớn hơn đó trở nên khó khăn hơn để theo dõi. 21 00:00:58,810 --> 00:01:02,640 Mặc dù chúng tôi biết những gì vấn đề là, mấu chốt của vấn đề đúng 22 00:01:02,640 --> 00:01:06,250 có thể cố gắng để xác định đặc biệt nơi các lỗi xảy ra, 23 00:01:06,250 --> 00:01:09,750 xác định những vấn đề mà là, và sau đó sửa chữa nó. 24 00:01:09,750 --> 00:01:14,400 Vì vậy, cung cấp này là một ví dụ về những gì có thể là một cái gì đó 25 00:01:14,400 --> 00:01:19,030 rằng chúng ta đã biết, nhưng có thể được chôn cất trong các yếu tố khác của mã. 26 00:01:19,030 --> 00:01:23,090 >> Vì vậy, mở nguồn khác này mã tập tin như là một ví dụ, 27 00:01:23,090 --> 00:01:27,165 vấn đề phân chia này bây giờ là một phần của một chương trình lớn hơn. 28 00:01:27,165 --> 00:01:29,040 Vẫn có thể là một chút bit trù định, và chúng tôi 29 00:01:29,040 --> 00:01:31,076 có thể có thể dễ dàng xác định nó, đặc biệt 30 00:01:31,076 --> 00:01:32,450 kể từ khi chúng tôi chỉ thảo luận này. 31 00:01:32,450 --> 00:01:38,250 Nhưng chúng ta có thể hình dung ra rằng điều này Vấn đề có thể tồn tại trên một quy mô lớn hơn. 32 00:01:38,250 --> 00:01:45,450 >> Nếu tôi biên dịch này và bây giờ chạy nó, nhập một số lẻ, 33 00:01:45,450 --> 00:01:49,816 chúng ta có thể thấy rằng chúng ta không có được chính xác sản lượng mà chúng ta có thể mong đợi. 34 00:01:49,816 --> 00:01:51,690 Trong trường hợp cụ thể này, chúng ta có thể nói rằng chúng tôi 35 00:01:51,690 --> 00:01:56,060 muốn đếm tất cả các con số từ một đến một số số cụ thể. 36 00:01:56,060 --> 00:01:58,130 Và chúng ta có thể thấy rằng chúng ta có một loạt các vấn đề 37 00:01:58,130 --> 00:02:03,880 ở đây nếu chúng ta xuất ra, chỉ đơn giản, 0 và 1 khi chúng tôi cung cấp một đầu vào của 5. 38 00:02:03,880 --> 00:02:07,380 >> Vì vậy, chúng tôi đã biết rằng có một vấn đề ở đây. 39 00:02:07,380 --> 00:02:11,662 Nhưng chúng ta có thể không biết chính xác nơi mà vấn đề này thực sự tồn tại. 40 00:02:11,662 --> 00:02:13,620 Bây giờ một trong những cách mà chúng ta có thể cố gắng để sửa lỗi này 41 00:02:13,620 --> 00:02:15,745 là điều mà chúng tôi đã đã được giới thiệu. 42 00:02:15,745 --> 00:02:18,880 Chúng tôi chỉ có thể sử dụng nó trên một quy mô lớn hơn. 43 00:02:18,880 --> 00:02:21,680 >> On line 14, chúng tôi có hàm printf này, 44 00:02:21,680 --> 00:02:25,620 cho phép chúng ta in ra nhà nước các thông tin khác nhau. 45 00:02:25,620 --> 00:02:28,880 Và đây là một cái gì đó mà bạn cần sử dụng trong chương trình của bạn 46 00:02:28,880 --> 00:02:33,100 để cố gắng tìm ra chính xác những gì xảy ra ở nhiều dòng mã. 47 00:02:33,100 --> 00:02:36,350 Vì vậy, ngay cả khi đây không phải là kết quả cuối cùng mà chúng tôi thực sự 48 00:02:36,350 --> 00:02:39,830 muốn sản xuất ra của chương trình này, chúng tôi vẫn 49 00:02:39,830 --> 00:02:42,300 có thể có một số debug báo cáo, nơi chúng tôi 50 00:02:42,300 --> 00:02:46,970 có thể cố gắng để tìm ra chính xác những gì đang xảy ra bên trong mã của chúng tôi. 51 00:02:46,970 --> 00:02:51,210 >> Vì vậy, trong trường hợp này, tôi sẽ printf với tag debug. 52 00:02:51,210 --> 00:02:53,540 Trong trường hợp này, đây là chỉ là một chuỗi debug 53 00:02:53,540 --> 00:02:56,840 rằng tôi lên đặt để nó trở thành rất rõ ràng trong đầu ra của mã của tôi 54 00:02:56,840 --> 00:02:59,200 nó là gì mà tôi muốn thể hiện. 55 00:02:59,200 --> 00:03:04,410 Và đầu ra ở đây số rằng chúng tôi đã tính toán. 56 00:03:04,410 --> 00:03:06,800 >> Trong trường hợp này, tôi có thể muốn biết chính xác 57 00:03:06,800 --> 00:03:11,380 những gì đang xảy ra trước và sau khi một số tính toán cụ thể. 58 00:03:11,380 --> 00:03:16,224 Vì vậy, tôi có thể sử dụng một printf trước và sau đó dòng mã. 59 00:03:16,224 --> 00:03:18,640 Trong trường hợp này, tôi có thể thậm chí làm cho nó rõ ràng hơn một chút 60 00:03:18,640 --> 00:03:21,960 bằng cách nói debug trước và debug sau quá 61 00:03:21,960 --> 00:03:26,540 mà tôi không nhầm lẫn giữa bản thân mình với nhiều dòng mà trông giống hệt nhau. 62 00:03:26,540 --> 00:03:32,290 >> Bây giờ nếu chúng ta biên dịch này và chạy nó, nhập một số lượng như năm nữa, 63 00:03:32,290 --> 00:03:35,090 chúng ta có thể thấy rằng chúng tôi có Hiện tại sản lượng trước và sau 64 00:03:35,090 --> 00:03:40,670 và thấy rằng chúng tôi đã không được thực hiện một cách rõ ràng chia, rõ ràng, có số lượng 65 00:03:40,670 --> 00:03:43,680 rằng chúng tôi thực sự muốn làm. 66 00:03:43,680 --> 00:03:48,660 Bây giờ trong trường hợp này, đây là không thực sự là một đầu ra rõ ràng. 67 00:03:48,660 --> 00:03:52,440 Nó không thực sự là một kết quả rõ ràng rằng chúng tôi muốn ra khỏi chương trình đặc biệt này. 68 00:03:52,440 --> 00:03:54,427 >> Và đây là, một lần nữa, một chút trù định. 69 00:03:54,427 --> 00:03:57,510 Nhưng, có lẽ, một trong những điều mà chúng ta có thể làm gì nếu các đặc điểm kỹ thuật cho biết 70 00:03:57,510 --> 00:04:01,900 mà chúng tôi muốn chia này bằng 2 và thêm 1-- vậy nói cách khác, 71 00:04:01,900 --> 00:04:04,550 chúng tôi muốn làm tròn up-- sau đó chúng ta có thể biết rằng chúng ta có thể 72 00:04:04,550 --> 00:04:08,060 làm điều đó điều đặc biệt, trong trường hợp này. 73 00:04:08,060 --> 00:04:14,010 Bây giờ đây, chúng tôi biết rằng chúng tôi sẽ là có thể thêm 1 đến số giảm đi một nửa của chúng tôi. 74 00:04:14,010 --> 00:04:16,490 >> Hãy biên dịch lại này và xác nhận rằng đây 75 00:04:16,490 --> 00:04:18,860 được hành xử theo cách mà chúng ta muốn. 76 00:04:18,860 --> 00:04:21,980 Chúng ta có thể thấy rằng bây giờ trước có, chúng tôi có số lượng 5. 77 00:04:21,980 --> 00:04:26,620 Sau khi, chúng tôi có số lượng 3, mà theo đặc điểm kỹ thuật của chúng tôi, 78 00:04:26,620 --> 00:04:29,292 là những gì chúng tôi muốn làm. 79 00:04:29,292 --> 00:04:31,000 Nhưng nếu chúng ta nhìn vào đầu ra ở đây, chúng ta có thể 80 00:04:31,000 --> 00:04:33,760 thấy rằng chúng tôi có thể có một lỗi hoàn toàn, đó là 81 00:04:33,760 --> 00:04:36,940 rằng chúng ta đang bắt đầu đếm của chúng tôi từ 0. 82 00:04:36,940 --> 00:04:39,390 >> Bây giờ một lần nữa, đây là một cái gì đó mà chúng ta đã thấy trong quá khứ 83 00:04:39,390 --> 00:04:42,500 và chúng tôi có thể sửa chữa khá dễ dàng. 84 00:04:42,500 --> 00:04:44,790 Nhưng trong trường hợp này, chúng tôi cũng có lợi ích 85 00:04:44,790 --> 00:04:48,940 của việc sử dụng câu lệnh printf trực tiếp bên trong các vòng lặp for 86 00:04:48,940 --> 00:04:52,930 để biết chính xác nơi lỗi đã xảy ra. 87 00:04:52,930 --> 00:04:55,150 Vì vậy, báo cáo printf rất hữu ích trong việc giúp đỡ 88 00:04:55,150 --> 00:04:57,940 bạn xác định nơi, chính xác trong mã nguồn của bạn, 89 00:04:57,940 --> 00:05:00,620 một lỗi cụ thể đang xảy ra. 90 00:05:00,620 --> 00:05:03,650 >> Và nó cũng quan trọng để nhận ra rằng, khi chúng tôi đang viết code, 91 00:05:03,650 --> 00:05:06,052 chúng ta có thể có những giả định về tình trạng của một chương trình. 92 00:05:06,052 --> 00:05:08,510 Hoặc chúng ta có thể có những giả định về những gì một phần của chương trình 93 00:05:08,510 --> 00:05:13,020 thực sự là đúng hay sai khi sau này khi chúng ta xây dựng trên chương trình 94 00:05:13,020 --> 00:05:15,950 và làm cho nó một phần của một phức tạp và chương trình lớn hơn 95 00:05:15,950 --> 00:05:19,700 mà chúng ta nhận ra rằng một số khía cạnh đó thực sự là lỗi. 96 00:05:19,700 --> 00:05:22,680 >> Sử dụng printf thực sự có thể giúp thu hẹp và xác định 97 00:05:22,680 --> 00:05:26,430 các vùng trong một chương trình mà không thể được hành xử một cách chính xác cách mà chúng tôi 98 00:05:26,430 --> 00:05:29,500 mong đợi, dựa trên những giả định của chúng tôi. 99 00:05:29,500 --> 00:05:31,460 Nhưng có các công cụ khác có sẵn, cũng như, 100 00:05:31,460 --> 00:05:34,860 cho phép chúng ta cố gắng để con số ra nơi một lỗi xảy ra 101 00:05:34,860 --> 00:05:39,930 và cũng có thể, đặc biệt, những gì mọi thứ đang xảy ra bên trong của chương trình. 102 00:05:39,930 --> 00:05:41,990 >> Vì vậy, sử dụng printf là rất khi hữu ích, chúng tôi muốn 103 00:05:41,990 --> 00:05:45,900 để xác định các khu vực cụ thể của một chương trình có một số lỗi. 104 00:05:45,900 --> 00:05:47,730 Nhưng nó cũng trở thành tẻ nhạt sau một thời gian. 105 00:05:47,730 --> 00:05:50,500 Trong trường hợp này, đây là một chương trình tương đối đơn giản 106 00:05:50,500 --> 00:05:52,750 chỉ với một hoặc hai biến. 107 00:05:52,750 --> 00:05:57,260 Và nó trở nên rất dễ dàng cho chúng tôi in ra các giá trị của các biến 108 00:05:57,260 --> 00:05:59,670 trong bối cảnh các chương trình lớn hơn. 109 00:05:59,670 --> 00:06:02,670 >> Nhưng chúng ta có thể có một khác nhau Chương trình có nhiều biến. 110 00:06:02,670 --> 00:06:06,530 Và nó có thể không được khá rất dễ dàng để sử dụng printf 111 00:06:06,530 --> 00:06:10,120 để cố gắng đánh giá những gì đang xảy ra cho mỗi một trong những biến 112 00:06:10,120 --> 00:06:13,590 như các chương trình được thực hiện. 113 00:06:13,590 --> 00:06:16,960 Có một chương trình mà tồn tại được gọi là một chương trình gỡ rối. 114 00:06:16,960 --> 00:06:20,320 Trong trường hợp này, một trong đó chúng tôi sẽ sử dụng là các chương trình gỡ rối GNU, hoặc GDB, 115 00:06:20,320 --> 00:06:24,260 cho phép chúng ta kiểm tra nội bộ hoạt động của một chương trình trong một nhiều hơn 116 00:06:24,260 --> 00:06:25,700 cách chi tiết. 117 00:06:25,700 --> 00:06:28,810 >> Chúng tôi thực sự có thể thực hiện GDB từ dòng lệnh 118 00:06:28,810 --> 00:06:35,370 ở đây chỉ đơn giản bằng cách gõ GDB và lệnh mà chúng ta muốn gỡ lỗi. 119 00:06:35,370 --> 00:06:37,550 Trong trường hợp này, đếm. 120 00:06:37,550 --> 00:06:41,650 Bây giờ trong trường hợp này, chúng ta có thể thấy rằng nó đưa chúng ta đến một nhắc nhở rằng nói GDB. 121 00:06:41,650 --> 00:06:44,020 Và chúng ta có thể thực sự thực hiện các lệnh để GDB 122 00:06:44,020 --> 00:06:48,260 để thực sự bắt đầu thực hiện các chương trình, nó dừng lại ở một số điểm, 123 00:06:48,260 --> 00:06:51,060 đánh giá các biến và kiểm tra các biến 124 00:06:51,060 --> 00:06:54,152 tồn tại trong các chương trình nhà nước tại thời điểm đó cụ, 125 00:06:54,152 --> 00:06:55,110 và vv và vv. 126 00:06:55,110 --> 00:06:57,240 Nó cung cấp rất nhiều năng lượng cho chúng ta. 127 00:06:57,240 --> 00:06:59,960 >> Nhưng nó chỉ như vậy sẽ xảy ra mà IDE cũng CS50 128 00:06:59,960 --> 00:07:05,870 cung cấp một giao diện đồ họa hoặc một người dùng giao diện cho GDB mà 129 00:07:05,870 --> 00:07:11,120 cho phép chúng ta làm điều này mà không cần giao diện dòng lệnh nào 130 00:07:11,120 --> 00:07:13,560 hoặc ở tất cả thậm chí. 131 00:07:13,560 --> 00:07:16,930 Cách mà tôi có thể truy cập là bằng cách sử dụng các nút gỡ lỗi 132 00:07:16,930 --> 00:07:20,120 ở đầu rất của IDE CS50. 133 00:07:20,120 --> 00:07:24,280 Bây giờ trong quá khứ, những gì chúng tôi có nhìn thấy là chúng ta sử dụng lệnh 134 00:07:24,280 --> 00:07:27,660 dòng để biên dịch và sau đó chạy một chương trình. 135 00:07:27,660 --> 00:07:29,790 >> Các nút gỡ lỗi không cả của những người bước. 136 00:07:29,790 --> 00:07:34,380 Nhưng nó cũng sẽ mang đến những tab trình gỡ lỗi trên bên phải 137 00:07:34,380 --> 00:07:38,280 cho phép chúng ta kiểm tra một loạt các tính chất của chương trình 138 00:07:38,280 --> 00:07:40,500 vì nó được thực hiện. 139 00:07:40,500 --> 00:07:44,280 Nếu tôi nhấp debug, trong này trường hợp, nó sẽ mang đến 140 00:07:44,280 --> 00:07:48,230 một tab mới trong giao diện điều khiển cửa sổ ở dưới cùng rất. 141 00:07:48,230 --> 00:07:51,160 >> Và bạn có thể thấy tab này có một số thông tin ở đầu rất. 142 00:07:51,160 --> 00:07:52,670 Và chúng ta phần lớn có thể bỏ qua điều này. 143 00:07:52,670 --> 00:07:54,800 Nhưng một trong những điều mà chúng tôi muốn thông báo 144 00:07:54,800 --> 00:07:57,170 là kết quả đầu ra cùng một điều mà chúng tôi 145 00:07:57,170 --> 00:08:03,000 sẽ nhận được nếu chúng ta cố gắng chạy làm cho trên các chương trình C trong cửa sổ terminal. 146 00:08:03,000 --> 00:08:06,230 >> Ở đây, chúng ta có thể thấy nó đang chạy kêu vang, và nó có nhiều cờ, 147 00:08:06,230 --> 00:08:12,660 và nó được biên dịch tập tin count.c của chúng tôi, đó là các tab được chọn vào thời điểm đó 148 00:08:12,660 --> 00:08:15,100 mà tôi nhấn debug. 149 00:08:15,100 --> 00:08:18,010 Vì vậy, điều này rất hữu ích vì bây giờ sử dụng nút gỡ lỗi này, 150 00:08:18,010 --> 00:08:23,280 chúng ta có thể cùng một lúc biên dịch và sau đó thực hiện các chương trình mà chúng tôi thực sự 151 00:08:23,280 --> 00:08:24,460 muốn chạy. 152 00:08:24,460 --> 00:08:27,880 >> Một trong những lá cờ đó là quan trọng, trong trường hợp này, 153 00:08:27,880 --> 00:08:30,190 chúng tôi đã thực sự được sử dụng cho thời gian lâu nhất 154 00:08:30,190 --> 00:08:32,450 nhưng cũng chỉ làm một số tay vẫy [Không nghe thấy], mà 155 00:08:32,450 --> 00:08:33,820 là một trong những điều này ngay tại đây. 156 00:08:33,820 --> 00:08:35,790 Trong vang, nó nói -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 Trong trường hợp này, chúng ta là gì nói vang, trình biên dịch của chúng tôi, 159 00:08:41,250 --> 00:08:43,820 là chúng ta muốn biên dịch chương trình của chúng tôi. 160 00:08:43,820 --> 00:08:46,810 Nhưng cũng cung cấp là gì được gọi là thông tin biểu tượng 161 00:08:46,810 --> 00:08:50,940 để trình biên dịch thực sự có quyền truy cập với rất nhiều các thông tin cơ bản 162 00:08:50,940 --> 00:08:52,610 chứa trong các chương trình. 163 00:08:52,610 --> 00:08:55,260 >> Cụ thể hơn, số các chức năng mà tôi có, 164 00:08:55,260 --> 00:08:58,000 tên của những chức năng, các biến, các loại 165 00:08:58,000 --> 00:09:01,730 rằng những biến là, và một loạt những thứ khác mà giúp gỡ rối 166 00:09:01,730 --> 00:09:04,350 thực hiện các hoạt động của nó. 167 00:09:04,350 --> 00:09:06,600 Bây giờ có cái gì khác đó là quan trọng để đề cập đến 168 00:09:06,600 --> 00:09:10,280 khi chúng tôi đang thảo luận về hoạt động một chương trình theo cách này. 169 00:09:10,280 --> 00:09:13,660 >> Chú ý rằng nó có thực sự đưa ra một tab mới trong giao diện điều khiển của chúng tôi 170 00:09:13,660 --> 00:09:14,780 dọc theo phía dưới. 171 00:09:14,780 --> 00:09:18,600 Chúng tôi không còn phải tương tác trực tiếp với cửa sổ terminal. 172 00:09:18,600 --> 00:09:21,420 Nhưng tab mới này là thực sự là một cửa sổ terminal. 173 00:09:21,420 --> 00:09:26,710 Nó chỉ là cụ thể cho các hoạt động chương trình mà chúng tôi đã tạo ra. 174 00:09:26,710 --> 00:09:29,270 >> Chú ý rằng ở phía dưới, trong kết hợp với một số đầu ra 175 00:09:29,270 --> 00:09:33,500 bởi Clang trình biên dịch và GDB, mà chúng ta phần lớn có thể bỏ qua, 176 00:09:33,500 --> 00:09:37,570 nó thực sự cho thấy đầu ra của Chương trình của chúng tôi ở dưới cùng rất. 177 00:09:37,570 --> 00:09:41,240 Bây giờ điều quan trọng là nhận ra rằng một trong những cửa sổ này thực sự 178 00:09:41,240 --> 00:09:43,360 sẽ hiển thị cho bạn đầu ra từ chương trình của bạn 179 00:09:43,360 --> 00:09:47,190 nhưng cũng có thể chấp nhận đầu vào cho chương trình đó, là tốt. 180 00:09:47,190 --> 00:09:49,260 >> Vì vậy, thông báo nói rằng vui lòng nhập một số, 181 00:09:49,260 --> 00:09:53,050 đó là đầu ra tương tự mà chúng tôi đã có đã có trong cửa sổ terminal trước. 182 00:09:53,050 --> 00:09:55,510 Nhưng nó bây giờ được hiển thị trong tab mới này. 183 00:09:55,510 --> 00:09:56,550 Tôi có thể nhập vào một số. 184 00:09:56,550 --> 00:10:00,900 Và nó sẽ thực sự chức năng như chúng tôi mong đợi 185 00:10:00,900 --> 00:10:05,890 cho chúng ta thấy debug của chúng tôi, sản lượng, đầu ra có thể có lỗi, 186 00:10:05,890 --> 00:10:07,010 như chúng ta đã thấy trước đây. 187 00:10:07,010 --> 00:10:10,460 Và ở rất dưới, nó thực sự có một số sản lượng thêm 188 00:10:10,460 --> 00:10:14,550 từ GDP chỉ nói rằng Chương trình này đã hoàn thành. 189 00:10:14,550 --> 00:10:16,655 >> Bây giờ như bạn đã thấy trong này chạy cụ thể thông qua, 190 00:10:16,655 --> 00:10:19,370 nó không phải là đặc biệt hữu ích bởi vì ngay cả 191 00:10:19,370 --> 00:10:23,740 mặc dù chúng tôi đã có đơn trình sửa lỗi đi lên, điều này vẫn còn là một chương trình đang chạy. 192 00:10:23,740 --> 00:10:26,790 Tại thời điểm đã làm nó thực sự tạm dừng thực hiện cho chúng tôi 193 00:10:26,790 --> 00:10:30,767 để có thể kiểm tra tất cả các các biến chứa bên trong. 194 00:10:30,767 --> 00:10:32,850 Có cái gì khác rằng chúng ta phải làm theo thứ tự 195 00:10:32,850 --> 00:10:36,910 để có được GDB để nhận ra rằng chúng ta muốn để tạm dừng thực hiện của chương trình 196 00:10:36,910 --> 00:10:42,820 và không chỉ cho phép nó để tiến hành bình thường như chúng ta sẽ làm trong bất kỳ trường hợp khác. 197 00:10:42,820 --> 00:10:45,530 >> Để tạm dừng thực hiện, tại một số dòng cụ thể, 198 00:10:45,530 --> 00:10:47,830 chúng ta cần phải tạo ra những gì được gọi là một điểm break. 199 00:10:47,830 --> 00:10:52,670 Và một điểm break là rất dễ dàng tạo ra trong này CS50 IDE bằng cách lấy con chuột của bạn 200 00:10:52,670 --> 00:10:57,090 và nhấp trực tiếp vào bên trái của một số dòng số cụ thể. 201 00:10:57,090 --> 00:10:59,920 Khi tôi làm điều đó, một chấm đỏ xuất hiện, mà chỉ ra 202 00:10:59,920 --> 00:11:02,300 mà dòng mà bây giờ là một điểm break. 203 00:11:02,300 --> 00:11:07,540 >> Và lần sau đó tôi chạy GDB, nó sẽ ngừng thực hiện ở thời điểm nghỉ 204 00:11:07,540 --> 00:11:10,280 khi nó đạt đến dòng mã. 205 00:11:10,280 --> 00:11:12,230 Bây giờ đây là một quan trọng điều để nhận ra 206 00:11:12,230 --> 00:11:16,140 rằng nó không nhất thiết phải là trường hợp đó mỗi dòng mã 207 00:11:16,140 --> 00:11:17,880 thực sự là có thể truy cập. 208 00:11:17,880 --> 00:11:23,780 Nếu tôi là để tạo ra một chức năng lên đây, cho example-- trống f-- 209 00:11:23,780 --> 00:11:31,230 và chỉ cần làm một dòng in here-- chào world-- nếu tôi không bao giờ gọi chức năng này, 210 00:11:31,230 --> 00:11:34,770 nó sẽ được các trường hợp đó, nếu tôi đặt một điểm break ở đây, 211 00:11:34,770 --> 00:11:36,220 chức năng sẽ không bao giờ được gọi. 212 00:11:36,220 --> 00:11:38,310 Và do đó, điều này điểm break đặc biệt 213 00:11:38,310 --> 00:11:43,040 sẽ không bao giờ thực sự tạm dừng thực hiện chương trình. 214 00:11:43,040 --> 00:11:48,020 >> Vì vậy, chúng ta hãy nói rằng tôi tạo ra một cách chính xác một điểm break trên một số dòng mã 215 00:11:48,020 --> 00:11:50,340 mà thực sự sẽ được thực thi. 216 00:11:50,340 --> 00:11:53,470 Bây giờ trong trường hợp này, đây là Dòng đầu tiên trong các chức năng chính. 217 00:11:53,470 --> 00:11:56,630 Vì vậy, nó chắc chắn sẽ được các trường hợp rằng, ngay sau khi tôi bắt đầu thực hiện, 218 00:11:56,630 --> 00:11:58,580 dòng đầu tiên sẽ đạt được. 219 00:11:58,580 --> 00:12:00,230 GDB sẽ tạm dừng thực hiện. 220 00:12:00,230 --> 00:12:04,100 Và sau đó, tôi sẽ có thể tương tác với trình gỡ rối. 221 00:12:04,100 --> 00:12:08,480 >> Bạn có thể thiết lập nhiều dòng như breakpoint, nếu bạn muốn. 222 00:12:08,480 --> 00:12:11,365 Chúng tôi cũng có thể tạo ra một dòng lên ở đây trong phân khúc này của mã 223 00:12:11,365 --> 00:12:12,490 rằng sẽ không bao giờ đạt được. 224 00:12:12,490 --> 00:12:14,744 Và chúng ta cũng có thể thiết lập một chi tiết dưới đây. 225 00:12:14,744 --> 00:12:16,660 Lý do mà chúng ta sẽ muốn làm điều này chúng ta sẽ 226 00:12:16,660 --> 00:12:19,119 đi vào một chút nữa chi tiết chỉ trong một khoảnh khắc. 227 00:12:19,119 --> 00:12:21,660 Vì vậy, bây giờ, hãy để tôi chỉ vô hiệu hóa những điểm break thêm 228 00:12:21,660 --> 00:12:24,940 để chúng ta có thể nhìn vào những gì sẽ xảy ra khi tôi có một break duy nhất 229 00:12:24,940 --> 00:12:27,650 điểm trong chương trình của tôi. 230 00:12:27,650 --> 00:12:29,410 Tôi đã thực hiện một số thay đổi cho chương trình này. 231 00:12:29,410 --> 00:12:30,750 Vì vậy, tôi cần phải lưu nó. 232 00:12:30,750 --> 00:12:34,490 Tôi sẽ bấm debug để tôi có thể bắt đầu việc xây dựng và sau đó 233 00:12:34,490 --> 00:12:36,880 thực hiện các chương trình gỡ rối. 234 00:12:36,880 --> 00:12:40,632 >> Chúng ta sẽ thấy rằng, sau thời gian ngắn, dòng mà chúng chọn là giờ nghỉ 235 00:12:40,632 --> 00:12:43,360 điểm được đánh dấu màu vàng. 236 00:12:43,360 --> 00:12:47,440 Chúng tôi cũng có thể nhận thấy rằng trong trên bên phải trong bảng debug 237 00:12:47,440 --> 00:12:50,940 mà biểu tượng tạm dừng đã biến thành một biểu tượng play chút. 238 00:12:50,940 --> 00:12:54,710 Điều này có nghĩa rằng chúng ta phải tạm dừng thực hiện, trong trường hợp đặc biệt này. 239 00:12:54,710 --> 00:12:57,840 Và nhấn nút Play sẽ cho phép chúng tôi tiếp tục thực hiện 240 00:12:57,840 --> 00:13:00,000 ở thời điểm cụ thể. 241 00:13:00,000 --> 00:13:03,240 >> Chú ý rằng có một vài khác các nút có sẵn trong bảng debug này, 242 00:13:03,240 --> 00:13:04,220 cũng. 243 00:13:04,220 --> 00:13:09,470 Bước qua, cho phép tôi để thực hiện mà một dòng mã 244 00:13:09,470 --> 00:13:14,030 và bước qua đó dòng vào Người tiếp theo, trong đó, trong trường hợp này, 245 00:13:14,030 --> 00:13:17,060 sẽ có nghĩa là printf statement được thực hiện. 246 00:13:17,060 --> 00:13:22,310 Và sau đó nó sẽ tạm dừng thực hiện trên dòng 13, như vậy. 247 00:13:22,310 --> 00:13:25,090 >> Và đó cũng là một bước vào chức năng, trong đó 248 00:13:25,090 --> 00:13:28,950 là hữu ích nếu tôi đã tạo ra khác chức năng ở những nơi khác trong mã nguồn. 249 00:13:28,950 --> 00:13:31,420 Và tôi muốn bước vào những chức năng hơn 250 00:13:31,420 --> 00:13:33,050 thực hiện chức năng như một toàn thể. 251 00:13:33,050 --> 00:13:37,279 Nhưng chúng ta sẽ xem xét chi tiết ở bước vào chức năng chỉ trong một khoảnh khắc. 252 00:13:37,279 --> 00:13:40,320 Bây giờ nhận thấy một số thứ khác mà thực sự tồn tại trong bảng debug này. 253 00:13:40,320 --> 00:13:44,110 >> Chúng tôi có bảng này được gọi là gọi chồng, mà cho chúng ta thấy 254 00:13:44,110 --> 00:13:45,300 nơi chính xác chúng ta đang có. 255 00:13:45,300 --> 00:13:48,550 Trong trường hợp này, chúng ta đang ở trong các chức năng chính. 256 00:13:48,550 --> 00:13:50,880 Kịch bản của chúng tôi được gọi là count.c. 257 00:13:50,880 --> 00:13:53,820 Và chúng tôi xảy ra được trên dòng 13, cột một, mà 258 00:13:53,820 --> 00:13:58,950 chính xác là những gì các khu vực được đánh dấu của mã nguồn chỉ ra, là tốt. 259 00:13:58,950 --> 00:14:02,435 >> Bây giờ để ý rằng điều này cũng cho thấy dưới phần biến địa phương 260 00:14:02,435 --> 00:14:06,710 tất cả các biến số tồn tại trong chức năng này. 261 00:14:06,710 --> 00:14:08,930 Điều quan trọng cần lưu ý rằng tất cả các biến 262 00:14:08,930 --> 00:14:12,580 sẽ xuất hiện trong biến địa phương này phần trong một hàm, 263 00:14:12,580 --> 00:14:14,380 ngay cả trước khi chúng được định nghĩa. 264 00:14:14,380 --> 00:14:19,160 Chúng ta có thể thấy ở đây là chúng ta có một biến gọi là num, có một giá trị mặc định là 0, 265 00:14:19,160 --> 00:14:21,280 và nó sẽ là kiểu int. 266 00:14:21,280 --> 00:14:24,110 >> Bây giờ trước khi chúng tôi thực sự khởi tạo tất cả các biến, 267 00:14:24,110 --> 00:14:26,685 chúng tôi không nhất thiết phải bảo đảm để nhìn thấy một giá trị 0. 268 00:14:26,685 --> 00:14:29,200 Và tùy thuộc vào hành khác mà bạn đã thực hiện 269 00:14:29,200 --> 00:14:32,020 và nhà nước của bộ nhớ của bạn khi bạn thực sự chạy chương trình này, 270 00:14:32,020 --> 00:14:34,605 bạn có thể thấy rằng bạn không thấy giá trị của 0 271 00:14:34,605 --> 00:14:36,550 và, thay vào đó, một số con số điên khác. 272 00:14:36,550 --> 00:14:38,390 >> Nhưng đừng lo lắng về điều đó. 273 00:14:38,390 --> 00:14:44,610 Nó sẽ không có liên quan đến bạn thực sự khởi tạo giá trị. 274 00:14:44,610 --> 00:14:49,630 Bây giờ trong trường hợp này, chúng ta có thể thấy rằng Tôi đã thực hiện một số kết quả đầu ra. 275 00:14:49,630 --> 00:14:52,131 Và tôi, ngay bây giờ, tạm dừng thực hiện. 276 00:14:52,131 --> 00:14:53,880 Nhưng trong trường hợp này, những gì Tôi thực sự muốn làm 277 00:14:53,880 --> 00:14:58,060 là đến nay bước qua dòng này mã để tôi có thể thực sự 278 00:14:58,060 --> 00:15:04,390 truy vấn người sử dụng cho rằng int chúng tôi muốn sử dụng trong chương trình của chúng tôi. 279 00:15:04,390 --> 00:15:07,060 >> Bây giờ trong trường hợp này, khi Tôi nhấn bước qua, thông báo 280 00:15:07,060 --> 00:15:11,940 rằng Pause hay đúng hơn là Resume nút đã thay đổi để nút Pause này 281 00:15:11,940 --> 00:15:14,022 vì mã này được thực thi. 282 00:15:14,022 --> 00:15:15,730 Chuyện gi đang xảy ra đúng là bây giờ mà nó là 283 00:15:15,730 --> 00:15:21,630 chờ đợi chúng ta nhập vào một số thông tin như chúng ta có thể nhìn thấy bằng văn bản của chúng tôi đầu ra 284 00:15:21,630 --> 00:15:23,600 ở đáy. 285 00:15:23,600 --> 00:15:25,787 >> Vì vậy, ngay bây giờ, đây là không thực sự dừng lại, 286 00:15:25,787 --> 00:15:28,620 mặc dù nó, loại, xuất hiện là vì không có gì đang xảy ra. 287 00:15:28,620 --> 00:15:32,360 Nhưng nó chỉ như vậy sẽ xảy ra rằng trong trường hợp cụ thể của tôi trên đường 13, 288 00:15:32,360 --> 00:15:34,210 Tôi đang chờ đợi cho người dùng nhập vào. 289 00:15:34,210 --> 00:15:39,130 Và như vậy GDB là không thể kiểm tra một chương trình khi nó đang chạy. 290 00:15:39,130 --> 00:15:43,370 >> Bây giờ thời gian tiếp theo mà tôi nhập vào một số input-- vì vậy tôi sẽ nhập số 5, 291 00:15:43,370 --> 00:15:46,140 như chúng ta đã thấy trong các past-- nhấn trở lại, và chúng tôi 292 00:15:46,140 --> 00:15:51,430 nhận thấy rằng, ngay lập tức, GDB tạm dừng và, một lần nữa, làm nổi bật những dòng tiếp theo. 293 00:15:51,430 --> 00:15:55,320 Nhưng nhận thấy rằng bây giờ, khi một Kết quả của chúng tôi nhập vào một giá trị, 294 00:15:55,320 --> 00:15:58,930 chúng tôi đã cập nhật giá trị bên trong của các biến địa phương của chúng tôi, 295 00:15:58,930 --> 00:16:05,560 là rất hữu ích để biết chính xác những con số này là trong bộ nhớ. 296 00:16:05,560 --> 00:16:10,650 >> Bây giờ tôi có thể cho phép chương trình này để tiếp tục chơi cho đến khi kết thúc thực hiện của nó 297 00:16:10,650 --> 00:16:12,570 bằng cách nhấn Resume. 298 00:16:12,570 --> 00:16:16,410 Chúng ta có thể thấy rằng rất nhanh chóng không hoàn thành chương trình thực thi 299 00:16:16,410 --> 00:16:19,790 với sản lượng tương tự mà chúng ta có trước đây, trình sửa lỗi đóng lại, 300 00:16:19,790 --> 00:16:23,170 và bây giờ chương trình này đã ngừng hoàn toàn. 301 00:16:23,170 --> 00:16:25,320 >> Tôi thấy chỉ cho mục đích của những gì nhìn thấy 302 00:16:25,320 --> 00:16:27,280 xảy ra khi chúng ta thực sự nhấn Resume. 303 00:16:27,280 --> 00:16:30,640 Nhưng chúng tôi thực sự đang đi muốn trở lại vào chương trình này 304 00:16:30,640 --> 00:16:33,820 để chúng ta có thể cố gắng để gỡ lỗi chính xác những gì đang xảy ra. 305 00:16:33,820 --> 00:16:37,980 Bây giờ tôi đang sử dụng các trình gỡ lỗi, tôi có thể không cần những báo cáo debug printf. 306 00:16:37,980 --> 00:16:43,860 >> Vì vậy, tôi có thể loại bỏ chúng như tôi sẽ làm bây giờ chỉ cần quay trở lại đoạn code đơn giản của chúng tôi 307 00:16:43,860 --> 00:16:45,950 rằng chúng tôi đã có một thời gian trước đây. 308 00:16:45,950 --> 00:16:48,790 Bây giờ khi tôi lưu chương trình và thực hiện nó, 309 00:16:48,790 --> 00:16:53,700 nó sẽ, một lần nữa, đi đến ban đầu mà phá vỡ thời điểm đó tôi đã có trên 11 dòng. 310 00:16:53,700 --> 00:16:57,700 Và tôi sẽ có thể kiểm tra biến tôi như tôi muốn làm. 311 00:16:57,700 --> 00:17:00,695 >> Nó chỉ như vậy sẽ xảy ra rằng đây một phần không phải là rất thú vị, 312 00:17:00,695 --> 00:17:04,364 Và tôi biết rằng tôi sẽ để in ra tuyên bố này. 313 00:17:04,364 --> 00:17:05,280 Vui lòng nhập một số. 314 00:17:05,280 --> 00:17:08,099 Và sau đó, tôi biết rằng tôi sẽ để yêu cầu người dùng cho số nguyên đó. 315 00:17:08,099 --> 00:17:13,329 Vì vậy, có lẽ, tôi thực sự muốn di chuyển của tôi điểm phá vỡ một chút tiếp tục xuống. 316 00:17:13,329 --> 00:17:16,710 >> Bạn có thể loại bỏ các điểm phá vỡ bằng cách nhấp chuột, một lần nữa, trực tiếp 317 00:17:16,710 --> 00:17:18,460 bên trái của con số dòng. 318 00:17:18,460 --> 00:17:22,200 Đó là dấu chấm màu đỏ sẽ biến mất, chỉ ra rằng điểm break là bây giờ đi. 319 00:17:22,200 --> 00:17:24,780 Bây giờ trong trường hợp này, thực hiện đã được tạm dừng. 320 00:17:24,780 --> 00:17:27,770 Và do đó, nó không thực sự đi vào nối lại vào đó ví dụ cụ thể. 321 00:17:27,770 --> 00:17:30,210 Nhưng tôi có thể thiết lập ngắt chỉ một chút sau đó. 322 00:17:30,210 --> 00:17:33,880 >> Và khi bây giờ tôi trở lại của tôi code, nó sẽ tiếp tục và nói 323 00:17:33,880 --> 00:17:36,190 điểm mà điểm break. 324 00:17:36,190 --> 00:17:37,374 Một lần nữa, tôi nhấn Resume. 325 00:17:37,374 --> 00:17:39,040 Không có vẻ như bất cứ điều gì đang xảy ra. 326 00:17:39,040 --> 00:17:41,450 Nhưng đó là bởi vì tôi đang chờ đợi đầu vào. 327 00:17:41,450 --> 00:17:47,900 Tôi sẽ nhập số 5, nhấn Enter, và Hiện tại các điểm break tiếp theo sẽ được trúng. 328 00:17:47,900 --> 00:17:50,570 >> Bây giờ trong trường hợp này, điều này là các dòng mã 329 00:17:50,570 --> 00:17:53,820 rằng, trước đây, chúng tôi đã biết đã xảy ra được lỗi. 330 00:17:53,820 --> 00:17:57,590 Vì vậy, chúng ta hãy đánh giá những gì sẽ xảy ra vào thời điểm đặc biệt này trong thời gian. 331 00:17:57,590 --> 00:18:02,620 Khi một dòng được nhấn mạnh, điều này đường vẫn chưa được thực thi. 332 00:18:02,620 --> 00:18:06,490 Vì vậy, trong trường hợp này, chúng ta có thể nhìn thấy rằng tôi có một số, mà 333 00:18:06,490 --> 00:18:11,610 Tôi có một số nguyên được gọi là num mà có giá trị 5. 334 00:18:11,610 --> 00:18:15,090 Và tôi sẽ thực hiện một số môn toán trên con số đó. 335 00:18:15,090 --> 00:18:20,130 >> Nếu tôi bước qua đó, chúng ta có thể nhận thấy rằng giá trị cho num 336 00:18:20,130 --> 00:18:23,780 đã thay đổi theo số học mà chúng tôi đã thực sự thực hiện. 337 00:18:23,780 --> 00:18:26,810 Và bây giờ chúng ta là bên trong này cho vòng lặp 338 00:18:26,810 --> 00:18:29,090 hay bây giờ mà cho vòng lặp chính nó được đánh dấu, 339 00:18:29,090 --> 00:18:32,450 chúng ta thấy rằng chúng tôi có một mới biến gọi là i rằng 340 00:18:32,450 --> 00:18:35,370 sẽ được sử dụng trong đó cho vòng lặp. 341 00:18:35,370 --> 00:18:38,230 >> Bây giờ hãy nhớ rằng trước khi tôi nói rằng đôi khi bạn 342 00:18:38,230 --> 00:18:43,470 sẽ thấy một số loại điên số như mặc định trước khi con số đó 343 00:18:43,470 --> 00:18:45,530 hoặc biến đó là thực sự khởi tạo. 344 00:18:45,530 --> 00:18:49,040 Chúng ta có thể thấy rằng chính xác ở đây trong biến này 345 00:18:49,040 --> 00:18:51,345 gọi tôi, trong đó có không chưa được khởi tạo 346 00:18:51,345 --> 00:18:53,560 đồng thời làm nổi bật. 347 00:18:53,560 --> 00:18:57,070 Nhưng chúng ta có thể thấy rằng nó có một số số rằng chúng tôi sẽ không thực sự mong đợi. 348 00:18:57,070 --> 00:18:57,620 >> Vậy là được rồi. 349 00:18:57,620 --> 00:18:59,661 Đừng lo lắng về nó bởi vì chúng tôi đã không thực sự 350 00:18:59,661 --> 00:19:04,970 khởi tạo số cho rằng, cho đến khi tôi bước qua dòng này và giá trị 351 00:19:04,970 --> 00:19:08,560 i đã được khởi tạo với giá trị 1. 352 00:19:08,560 --> 00:19:11,400 Vì vậy, để thấy rằng đó là thực sự các trường hợp, chúng ta hãy bước qua. 353 00:19:11,400 --> 00:19:14,420 Bây giờ chúng ta có thể thấy rằng dòng đã được thực thi. 354 00:19:14,420 --> 00:19:17,000 Và bây giờ chúng ta đang làm nổi bật dòng printf này. 355 00:19:17,000 --> 00:19:22,230 >> Và bây giờ chúng ta có thể thấy giá trị của chúng tôi của tôi và 3 đã thay đổi theo thời gian. 356 00:19:22,230 --> 00:19:26,450 Điều này là rất hữu ích để làm, trong thực tế, là để bước qua đường dây liên tục. 357 00:19:26,450 --> 00:19:30,480 Và bạn có thể tìm thấy những gì thực sự xảy ra trong vòng lặp của bạn 358 00:19:30,480 --> 00:19:33,660 và những gì sẽ xảy ra với các các biến bên trong đó cho vòng lặp 359 00:19:33,660 --> 00:19:39,200 như thực hiện chương trình xảy ra một bước tại một thời điểm. 360 00:19:39,200 --> 00:19:41,110 >> Bây giờ vào thời điểm này, tôi bước qua chỉ đủ 361 00:19:41,110 --> 00:19:44,210 rằng tôi bây giờ là ở phần cuối của chương trình của tôi. 362 00:19:44,210 --> 00:19:46,980 Nếu tôi bước trên đó, nó sẽ thực sự chấm dứt thực hiện 363 00:19:46,980 --> 00:19:48,860 như chúng ta đã thấy trong quá khứ. 364 00:19:48,860 --> 00:19:52,110 Hãy để tôi khởi động lại này, một lần nữa, vì vậy mà tôi có thể chỉ ra một cái gì đó khác, 365 00:19:52,110 --> 00:19:53,320 cũng. 366 00:19:53,320 --> 00:19:55,350 >> Trong trường hợp này, nó là Bây giờ hỏi tôi, một lần nữa, 367 00:19:55,350 --> 00:19:57,100 cho một con số, Tôi sẽ, một lần nữa, nhập. 368 00:19:57,100 --> 00:20:00,300 Nhưng lần này, tôi sẽ nhập vào trong một số lớn hơn để cho vòng lặp 369 00:20:00,300 --> 00:20:02,540 sẽ lặp lại lần nữa. 370 00:20:02,540 --> 00:20:06,090 Trong trường hợp này, tôi sẽ để nhập giá trị 11. 371 00:20:06,090 --> 00:20:08,390 >> Bây giờ một lần nữa bởi vì tôi muốn thiết lập một điểm break ở dòng 15, 372 00:20:08,390 --> 00:20:10,490 nó sẽ làm nổi bật dòng đó. 373 00:20:10,490 --> 00:20:12,980 Chúng ta có thể thấy rằng chúng tôi số 11 là đúng 374 00:20:12,980 --> 00:20:15,560 đại diện trong các biến địa phương của chúng tôi. 375 00:20:15,560 --> 00:20:22,460 Bước qua đó, chúng ta có thể bây giờ xem những gì sẽ xảy ra với giá trị của chúng ta về tôi 376 00:20:22,460 --> 00:20:25,680 khi chúng tôi tiến bên trong này cho vòng lặp. 377 00:20:25,680 --> 00:20:31,960 Nó được tăng lên mỗi lần chúng tôi đạt đến đỉnh của đó cho vòng lặp. 378 00:20:31,960 --> 00:20:35,110 >> Bây giờ một trong những điều mà có thể là hữu ích để làm trong thời gian thực 379 00:20:35,110 --> 00:20:40,490 của chương trình này là dành cho tôi để thực sự thay đổi các biến giữa dòng để xem 380 00:20:40,490 --> 00:20:42,450 những gì xảy ra với chương trình của tôi. 381 00:20:42,450 --> 00:20:46,540 Trong trường hợp này, tôi thực sự có thể nhấn đúp chuột vào giá trị. 382 00:20:46,540 --> 00:20:48,040 Chú ý rằng nó sẽ trở thành một lĩnh vực văn bản. 383 00:20:48,040 --> 00:20:50,280 >> Bây giờ tôi có thể nhập khác nhau giá trị hoàn toàn 384 00:20:50,280 --> 00:20:55,700 để xem cách ứng xử chương trình của tôi khi tôi đã thay đổi biến đó. 385 00:20:55,700 --> 00:20:59,560 Bây giờ trong trường hợp này, biến tôi bây giờ có giá trị 10. 386 00:20:59,560 --> 00:21:02,810 Nhưng chương trình vẫn là dừng lại trong thực hiện. 387 00:21:02,810 --> 00:21:07,610 Khi tôi bước qua, tôi thấy rằng các giá trị i, mà tôi nhập là 10, 388 00:21:07,610 --> 00:21:12,170 không được lớn hơn giá trị của num, mà ngay lập tức gây ra vòng lặp for 389 00:21:12,170 --> 00:21:14,240 để ngăn chặn thực thi. 390 00:21:14,240 --> 00:21:16,210 >> Bây giờ không phải là duy nhất Lý do tại sao bạn sẽ 391 00:21:16,210 --> 00:21:19,450 muốn thay đổi các biến tại chỗ. 392 00:21:19,450 --> 00:21:22,210 Bạn thực sự có thể muốn để cố gắng sửa đổi nó để 393 00:21:22,210 --> 00:21:24,590 mà bạn có thể tiếp tục thực hiện một vòng lặp 394 00:21:24,590 --> 00:21:27,370 hay như vậy mà bạn có thể sửa đổi một số giá trị trước khi nó 395 00:21:27,370 --> 00:21:32,630 đạt đến một số thiết lập cụ thể của số học mà bạn muốn thực hiện. 396 00:21:32,630 --> 00:21:36,210 >> Vì vậy, bây giờ mà chúng tôi thực sự thay đổi giá trị của i là chương trình đã được thực hiện, 397 00:21:36,210 --> 00:21:39,540 nó gây ra cho vòng lặp để bỏ thuốc lá sớm vì, tất cả của một đột ngột, i 398 00:21:39,540 --> 00:21:42,770 đã xảy ra để được lớn hơn giá trị của num, có nghĩa là cho rằng vòng lặp 399 00:21:42,770 --> 00:21:45,410 không còn cần thiết để được thực thi. 400 00:21:45,410 --> 00:21:48,780 Hơn nữa, nó đã xảy ra là trường hợp đó chúng tôi thay đổi giá trị của i 401 00:21:48,780 --> 00:21:53,270 khi đường 17 đã được đánh dấu, đó là điểm trong thời gian 402 00:21:53,270 --> 00:21:56,280 rằng để thực hiện vòng lặp đã thực sự được đánh giá. 403 00:21:56,280 --> 00:22:00,210 >> Nếu tôi đã thay đổi giá trị của i trên một dòng khác nhau, nói 19, 404 00:22:00,210 --> 00:22:03,360 chúng tôi đã thấy khác nhau hành vi vì dòng 19 sẽ 405 00:22:03,360 --> 00:22:08,310 đã thực hiện trước khi vòng lặp điều kiện được đánh giá lại. 406 00:22:08,310 --> 00:22:11,900 Bây giờ vào thời điểm này, tôi, một lần nữa, ở phần cuối của chương trình này. 407 00:22:11,900 --> 00:22:15,707 Và tôi có thể cho phép điều này để tiến hành cho phép chương trình của tôi để bỏ thuốc lá một cách tự nhiên. 408 00:22:15,707 --> 00:22:18,290 Nhưng có một vài điều đó là quan trọng để lấy đi 409 00:22:18,290 --> 00:22:19,960 từ cuộc thảo luận đặc biệt này. 410 00:22:19,960 --> 00:22:22,490 Bạn cần phải đánh giá giả định của riêng bạn 411 00:22:22,490 --> 00:22:24,710 về cách mã nên được hành xử. 412 00:22:24,710 --> 00:22:28,220 Bất cứ lúc nào bạn nghĩ rằng một số mảnh mã bạn biết sẽ xảy ra để làm việc, 413 00:22:28,220 --> 00:22:30,940 đó có thể là một lá cờ đỏ để đi trở lại và đánh giá, và chắc chắn 414 00:22:30,940 --> 00:22:33,470 rằng giả định của bạn cách mã đang hoạt động 415 00:22:33,470 --> 00:22:38,290 là thực sự đúng với nó như thế nào trong mã nguồn của bạn. 416 00:22:38,290 --> 00:22:41,300 >> Nhưng thậm chí nhiều hơn để điểm là, khi chúng ta đang sử dụng các trình gỡ lỗi, 417 00:22:41,300 --> 00:22:43,920 bạn có thể đặt breakpoint tại dòng khác nhau của mã, 418 00:22:43,920 --> 00:22:48,110 mà sẽ gây ra các trình sửa lỗi cho tạm dừng thực hiện tại mỗi của các đường 419 00:22:48,110 --> 00:22:52,210 do đó bạn có thể đánh giá bộ nhớ hoặc thậm chí thay đổi nó tại chỗ. 420 00:22:52,210 --> 00:22:55,630 Và một lần nữa, hãy nhớ rằng bạn có thể tạo nhiều breakpoint để bạn 421 00:22:55,630 --> 00:23:00,390 cũng có thể tiếp tục thực hiện, bỏ qua trên phần lớn các mã, 422 00:23:00,390 --> 00:23:04,790 và nó sẽ tự động tạm dừng tại các điểm nghỉ tiếp theo. 423 00:23:04,790 --> 00:23:07,760 >> Có thực sự nâng cao hơn Các tính năng của chương trình gỡ rối, là tốt. 424 00:23:07,760 --> 00:23:10,170 Nhưng chúng tôi muốn giới thiệu bạn để một số video tiếp theo 425 00:23:10,170 --> 00:23:14,090 để thực sự trêu chọc nhau như thế nào để sử dụng những chức năng đặc biệt. 426 00:23:14,090 --> 00:23:15,990 Để bây giờ, cảm ơn bạn rất nhiều để xem. 427 00:23:15,990 --> 00:23:18,080 Và may mắn gỡ lỗi.