1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Tất cả các quyền GDB. 3 00:00:06,830 --> 00:00:08,480 Đó là chính xác những gì? 4 00:00:08,480 --> 00:00:11,310 Vì vậy, GDB, viết tắt cho GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 là một công cụ thực sự tuyệt vời mà chúng ta có thể sử dụng để giúp chúng tôi gỡ lỗi chương trình của chúng tôi, 6 00:00:15,040 --> 00:00:18,210 hoặc tìm ra nơi mà mọi thứ đi sai trong các chương trình của chúng tôi. 7 00:00:18,210 --> 00:00:22,590 GDB là rất mạnh, nhưng đầu ra và tương tác với nó 8 00:00:22,590 --> 00:00:23,830 có thể là một chút khó hiểu. 9 00:00:23,830 --> 00:00:28,210 Nó thường là một công cụ dòng lệnh, và nó có thể ném rất nhiều tin nhắn vào bạn. 10 00:00:28,210 --> 00:00:31,144 Và nó có thể loại khó phân tích chính xác những gì đang xảy ra. 11 00:00:31,144 --> 00:00:33,560 Bước May mắn thay, chúng tôi đã thực hiện để khắc phục vấn đề này cho bạn 12 00:00:33,560 --> 00:00:36,281 khi bạn làm việc thông qua CS50. 13 00:00:36,281 --> 00:00:39,030 Nếu bạn không sử dụng các đồ họa gỡ rối, mà đồng nghiệp của tôi Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse đã nói khá một chút về trong một video 15 00:00:41,570 --> 00:00:44,740 nên chấm dứt tại đây ngay bây giờ, bạn có thể cần 16 00:00:44,740 --> 00:00:48,270 để sử dụng các dòng lệnh các công cụ để làm việc với GDB. 17 00:00:48,270 --> 00:00:51,250 Nếu bạn đang làm việc trong các CS50 IDE, bạn không cần phải làm điều này. 18 00:00:51,250 --> 00:00:53,550 Nhưng nếu bạn không làm việc trong các CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 có lẽ sử dụng một phiên bản của CS50 gia dụng, 20 00:00:55,750 --> 00:00:58,860 hoặc hoạt động khác Linux hệ thống với GDB cài đặt trên nó, 21 00:00:58,860 --> 00:01:00,980 bạn có thể cần phải sử dụng các công cụ dòng lệnh. 22 00:01:00,980 --> 00:01:02,860 >> Và vì có lẽ bạn phải làm điều đó, nó 23 00:01:02,860 --> 00:01:06,280 hữu ích chỉ để hiểu làm thế nào GDB hoạt động từ dòng lệnh. 24 00:01:06,280 --> 00:01:09,650 Nhưng một lần nữa, nếu bạn sử dụng các IDE CS50, bạn 25 00:01:09,650 --> 00:01:15,400 có thể sử dụng các trình sửa lỗi đồ họa được xây dựng vào IDE. 26 00:01:15,400 --> 00:01:18,750 Vì vậy, để có được những thứ đi với GDB, để bắt đầu gỡ lỗi 27 00:01:18,750 --> 00:01:21,220 quá trình của một cụ thể chương trình, tất cả các bạn cần làm 28 00:01:21,220 --> 00:01:23,810 được gõ GDB tiếp bởi tên chương trình. 29 00:01:23,810 --> 00:01:28,620 Vì vậy, ví dụ, nếu chương trình của bạn hello, bạn nên gõ GDB hello. 30 00:01:28,620 --> 00:01:31,210 >> Khi bạn làm điều đó, bạn sẽ để kéo lên môi trường GDB. 31 00:01:31,210 --> 00:01:33,800 Nhắc nhở của bạn sẽ thay đổi, và thay vì những gì nó thường 32 00:01:33,800 --> 00:01:35,841 là khi bạn gõ những thứ ở ls line-- lệnh, 33 00:01:35,841 --> 00:01:38,115 cd-- tất cả các đặc trưng của bạn Lệnh Linux, nhắc nhở của bạn 34 00:01:38,115 --> 00:01:42,200 sẽ thay đổi đến, có lẽ, một cái gì đó như dấu ngoặc đơn ngoặc GDB. 35 00:01:42,200 --> 00:01:46,630 Đó là GDB nhắc mới của bạn, bởi vì bạn đang ở trong môi trường GDB. 36 00:01:46,630 --> 00:01:49,830 Một khi bên trong của môi trường đó, có hai lệnh chính 37 00:01:49,830 --> 00:01:52,290 có thể bạn sẽ sử dụng theo thứ tự sau đây. 38 00:01:52,290 --> 00:01:55,200 >> Đầu tiên là b, là ngắn cho nghỉ. 39 00:01:55,200 --> 00:01:58,690 Và sau khi bạn gõ b, bạn thường gõ tên của một hàm, 40 00:01:58,690 --> 00:02:01,040 hoặc nếu bạn xảy ra để biết xung quanh những gì dòng số 41 00:02:01,040 --> 00:02:04,100 chương trình của bạn được bắt đầu cư xử một chút lạ, 42 00:02:04,100 --> 00:02:06,370 bạn có thể gõ một dòng số đó là tốt. 43 00:02:06,370 --> 00:02:09,660 B gì, hoặc nghỉ ngơi, không là nó cho phép chương trình của bạn 44 00:02:09,660 --> 00:02:13,270 để chạy cho đến một điểm nhất định, cụ thể là, tên của chức năng 45 00:02:13,270 --> 00:02:15,880 mà bạn chỉ định hoặc dòng số mà bạn chỉ định. 46 00:02:15,880 --> 00:02:18,590 >> Và tại thời điểm đó, nó sẽ đóng băng thực hiện. 47 00:02:18,590 --> 00:02:21,670 Đây là một điều thực sự tốt, bởi vì khi thực hiện đã được đông lạnh, 48 00:02:21,670 --> 00:02:25,214 bạn có thể bắt đầu rất chậm bước qua chương trình của bạn. 49 00:02:25,214 --> 00:02:28,130 Thông thường, nếu bạn đã chạy chương trình của bạn, chúng rất ngắn. 50 00:02:28,130 --> 00:02:31,250 Thông thường, bạn gõ dấu chấm dấu gạch chéo bất cứ điều gì tên của chương trình của bạn, nhấn Enter, 51 00:02:31,250 --> 00:02:33,470 và trước khi bạn có thể nhấp nháy, bạn Chương trình đã được hoàn thành. 52 00:02:33,470 --> 00:02:36,620 Nó không thực sự có rất nhiều thời gian để thử và tìm ra những gì đang xảy ra sai. 53 00:02:36,620 --> 00:02:40,920 Vì vậy, nó thực sự để có thể chậm điều xuống bằng cách thiết lập một điểm break với b, 54 00:02:40,920 --> 00:02:43,040 và sau đó bước vào. 55 00:02:43,040 --> 00:02:46,169 >> Sau đó, một khi bạn đã thiết lập nghỉ của bạn điểm, bạn có thể chạy chương trình. 56 00:02:46,169 --> 00:02:47,960 Và nếu bạn có bất kỳ đối số dòng lệnh, 57 00:02:47,960 --> 00:02:51,610 bạn chỉ định cho họ ở đây, không phải khi bạn gõ GDB tên chương trình của bạn. 58 00:02:51,610 --> 00:02:55,980 Bạn chỉ rõ tất cả các dòng lệnh đối số bằng cách lấy r, hoặc chạy, 59 00:02:55,980 --> 00:03:00,270 và sau đó đối số dòng lệnh bất cứ điều gì bạn cần bên trong của chương trình của bạn. 60 00:03:00,270 --> 00:03:03,510 Có một số khác thực sự lệnh quan trọng và hữu ích 61 00:03:03,510 --> 00:03:04,970 bên trong của môi trường GDP. 62 00:03:04,970 --> 00:03:07,540 Vì vậy, hãy để tôi một cách nhanh chóng đi qua một số trong số họ. 63 00:03:07,540 --> 00:03:11,320 >> Đầu tiên là n, mà là viết tắt tiếp theo, và bạn có thể gõ tiếp theo thay vì n, 64 00:03:11,320 --> 00:03:12,304 cả hai sẽ làm việc. 65 00:03:12,304 --> 00:03:13,470 Và nó chỉ là viết tắt. 66 00:03:13,470 --> 00:03:17,540 Và như bạn đã có thể đã nhận sử dụng để, để có thể gõ những thứ 67 00:03:17,540 --> 00:03:20,520 ngắn hơn nói chung là tốt. 68 00:03:20,520 --> 00:03:24,100 Và những gì nó sẽ làm điều đó là sẽ bước về phía trước một khối mã. 69 00:03:24,100 --> 00:03:26,170 Vì vậy, nó sẽ di chuyển về phía trước cho đến khi một cuộc gọi chức năng. 70 00:03:26,170 --> 00:03:28,350 Và sau đó thay vì lặn vào chức năng mà 71 00:03:28,350 --> 00:03:33,130 và đi qua tất cả các chức năng mà code, nó sẽ chỉ có các chức năng. 72 00:03:33,130 --> 00:03:34,400 >> Các chức năng sẽ được gọi. 73 00:03:34,400 --> 00:03:35,733 Nó sẽ làm bất cứ điều gì công việc của mình là. 74 00:03:35,733 --> 00:03:38,870 Nó sẽ trả về một giá trị cho hàm nào đã gọi nó. 75 00:03:38,870 --> 00:03:42,490 Và sau đó bạn sẽ chuyển sang dòng tiếp theo đó chức năng gọi điện thoại. 76 00:03:42,490 --> 00:03:44,555 Nếu bạn muốn bước bên trong của các chức năng, 77 00:03:44,555 --> 00:03:46,430 thay vì chỉ có nó thực hiện, đặc biệt là 78 00:03:46,430 --> 00:03:50,004 nếu bạn nghĩ rằng vấn đề có thể nằm bên trong hàm đó, 79 00:03:50,004 --> 00:03:52,670 bạn có thể, tất nhiên, thiết lập ngắt trỏ bên trong hàm đó. 80 00:03:52,670 --> 00:03:57,820 Hoặc nếu bạn đang chạy, bạn có thể sử dụng s để bước về phía trước một dòng mã. 81 00:03:57,820 --> 00:04:01,170 >> Vì vậy, đây sẽ bước vào và bổ nhào vào chức năng, 82 00:04:01,170 --> 00:04:04,750 thay vì chỉ có thực thi và tiếp tục trong các chức năng 83 00:04:04,750 --> 00:04:07,380 rằng bạn đang ở để gỡ lỗi. 84 00:04:07,380 --> 00:04:09,870 Nếu bạn đã bao giờ muốn biết giá trị của một biến, 85 00:04:09,870 --> 00:04:12,507 bạn có thể gõ p, hay Print, và sau đó là tên biến. 86 00:04:12,507 --> 00:04:15,090 Và đó sẽ in ra cho bạn, bên trong của môi trường GDB, 87 00:04:15,090 --> 00:04:19,110 tên của các biến, mà you-- tha me-- giá trị của biến 88 00:04:19,110 --> 00:04:20,064 mà bạn đã đặt tên. 89 00:04:20,064 --> 00:04:23,230 Nếu bạn muốn biết giá trị của mỗi biến thể truy cập địa phương từ nơi 90 00:04:23,230 --> 00:04:25,970 bạn hiện đang ở trong bạn chương trình, bạn có thể gõ info người dân địa phương. 91 00:04:25,970 --> 00:04:28,332 Nó nhanh hơn rất nhiều so với gõ p và sau đó bất cứ điều gì, 92 00:04:28,332 --> 00:04:30,540 liệt kê ra tất cả các biến mà bạn biết tồn tại. 93 00:04:30,540 --> 00:04:34,370 Bạn có thể gõ info người dân địa phương, và nó sẽ in ra tất cả mọi thứ cho bạn. 94 00:04:34,370 --> 00:04:37,770 Tiếp theo là bt, đó là ngắn để lại dấu vết. 95 00:04:37,770 --> 00:04:41,680 Bây giờ, nói chung, đặc biệt là vào đầu năm CS50, 96 00:04:41,680 --> 00:04:44,450 bạn sẽ không thực sự có dịp sử dụng bt, hoặc Back Trace, 97 00:04:44,450 --> 00:04:47,860 bởi vì bạn không có chức năng mà gọi các chức năng khác. 98 00:04:47,860 --> 00:04:50,450 >> Bạn có thể có một cuộc gọi chính chức năng, nhưng đó có lẽ nó. 99 00:04:50,450 --> 00:04:53,199 Bạn không cần phải có chức năng khác gọi một chức năng, trong đó 100 00:04:53,199 --> 00:04:54,880 gọi hàm khác, và như vậy. 101 00:04:54,880 --> 00:04:57,550 Nhưng như các chương trình của bạn nhận được nhiều hơn phức tạp, và đặc biệt 102 00:04:57,550 --> 00:05:00,290 khi bạn bắt đầu làm việc với đệ quy, lại dấu vết 103 00:05:00,290 --> 00:05:05,150 có thể là một cách thực sự hữu ích cho bạn loại có được một số bối cảnh cho nơi 104 00:05:05,150 --> 00:05:06,460 Tôi đang ở trong chương trình của tôi. 105 00:05:06,460 --> 00:05:10,590 Vì vậy, nói rằng bạn đã viết mã của bạn, và Bạn có biết rằng chính các cuộc gọi một chức năng 106 00:05:10,590 --> 00:05:14,720 f, trong đó kêu gọi một chức năng g, trong đó kêu gọi một hàm h. 107 00:05:14,720 --> 00:05:17,650 Vì vậy, chúng tôi có một số lớp Nesting xảy ra ở đây. 108 00:05:17,650 --> 00:05:19,440 >> Nếu bạn đang ở trong các môi trường GDB của bạn, 109 00:05:19,440 --> 00:05:21,640 và bạn biết bên trong của bạn của h, nhưng lại quên 110 00:05:21,640 --> 00:05:27,210 về những gì có bạn đến nơi mà bạn are-- bạn có thể gõ bt, hay lại dấu vết, 111 00:05:27,210 --> 00:05:32,370 và nó sẽ in ra h, g, f chính, cùng với một số thông tin khác, mà 112 00:05:32,370 --> 00:05:35,984 cung cấp cho bạn một đầu mối rằng, OK chính gọi là f, f gọi là g, g gọi là h, 113 00:05:35,984 --> 00:05:37,900 và đó là nơi tôi hiện đang trong chương trình của tôi. 114 00:05:37,900 --> 00:05:41,380 Vì vậy, nó có thể được thực sự hữu ích, đặc biệt là khó hiểu-Ness của GDB 115 00:05:41,380 --> 00:05:45,667 trở thành một chút áp đảo, để tìm ra chính xác nơi mà mọi thứ đang có. 116 00:05:45,667 --> 00:05:48,500 Cuối cùng, khi chương trình của bạn được thực hiện, hoặc khi bạn đang thực hiện gỡ nó 117 00:05:48,500 --> 00:05:50,125 và bạn muốn bước đi từ môi trường GDB, 118 00:05:50,125 --> 00:05:51,940 nó giúp để biết làm thế nào để có được ra khỏi nó. 119 00:05:51,940 --> 00:05:55,500 Bạn có thể gõ q, hoặc Quit, để nhận ra. 120 00:05:55,500 --> 00:05:59,220 Bây giờ, trước khi video hiện nay Tôi đã chuẩn bị một chương trình buggy 121 00:05:59,220 --> 00:06:03,900 gọi buggy1, mà tôi biên soạn từ một tập tin gọi là buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Như bạn có thể mong đợi, điều này chương trình là trong thực tế lỗi. 123 00:06:06,500 --> 00:06:08,990 Có điều gì sai khi tôi cố gắng và chạy nó. 124 00:06:08,990 --> 00:06:13,014 Bây giờ, thật không may, tôi vô tình xóa file buggy1.c của tôi, 125 00:06:13,014 --> 00:06:15,930 vì vậy để cho tôi để tìm ra những gì đang xảy ra sai với chương trình này, 126 00:06:15,930 --> 00:06:18,770 Tôi sẽ phải sử dụng GDB loại một cách mù quáng, cố gắng 127 00:06:18,770 --> 00:06:22,372 để điều hướng thông qua chương trình này để tìm ra chính xác những gì đang xảy ra sai. 128 00:06:22,372 --> 00:06:24,580 Nhưng chỉ sử dụng các công cụ chúng ta đã học về, 129 00:06:24,580 --> 00:06:27,700 chúng ta có thể khá nhiều con số ra đó là chính xác những gì. 130 00:06:27,700 --> 00:06:30,740 Vì vậy, hãy đi qua để CS50 IDE và có một cái nhìn. 131 00:06:30,740 --> 00:06:33,155 OK, vì vậy chúng ta ở đây trong tôi CS50 môi trường IDE, 132 00:06:33,155 --> 00:06:35,697 và tôi sẽ phóng to một chút vì vậy bạn có thể nhìn thấy nhiều hơn một chút. 133 00:06:35,697 --> 00:06:38,530 Trong cửa sổ thiết bị đầu cuối của tôi, nếu tôi liệt kê các nội dung của giám đốc hiện tại của tôi 134 00:06:38,530 --> 00:06:41,250 với ls, chúng ta sẽ thấy rằng tôi có một vài tập tin nguồn 135 00:06:41,250 --> 00:06:44,982 ở đây, bao gồm cả các thảo luận trước buggy1. 136 00:06:44,982 --> 00:06:46,940 Chính xác những gì đi vào khi Tôi cố gắng và chạy buggy1. 137 00:06:46,940 --> 00:06:47,773 Vâng chúng ta hãy cùng tìm hiểu. 138 00:06:47,773 --> 00:06:52,510 Tôi gõ dấu chấm dấu gạch chéo, lỗi, và tôi nhấn Enter. 139 00:06:52,510 --> 00:06:53,670 >> Lỗi phân khúc. 140 00:06:53,670 --> 00:06:55,000 Đó không phải là tốt. 141 00:06:55,000 --> 00:06:57,180 Nếu bạn nhớ lại, một lỗi segmentation thường 142 00:06:57,180 --> 00:07:01,540 xảy ra khi chúng ta truy cập vào bộ nhớ rằng chúng tôi không được phép chạm vào. 143 00:07:01,540 --> 00:07:03,820 Chúng tôi đã bằng cách nào đó đạt bên ngoài các giới hạn 144 00:07:03,820 --> 00:07:05,995 về những gì các chương trình, trình biên dịch, đã cho chúng ta. 145 00:07:05,995 --> 00:07:08,310 Và như vậy đã là một đầu mối để giữ trong hộp công cụ 146 00:07:08,310 --> 00:07:10,660 khi chúng tôi bắt đầu quá trình gỡ lỗi. 147 00:07:10,660 --> 00:07:13,620 Một cái gì đó đã đi một chút sai ở đây. 148 00:07:13,620 --> 00:07:15,935 >> Được rồi, vậy chúng ta hãy bắt đầu lập môi trường GDB 149 00:07:15,935 --> 00:07:19,030 và xem chúng ta có thể tìm ra những gì chính xác vấn đề là. 150 00:07:19,030 --> 00:07:21,674 Tôi sẽ để xóa màn hình của tôi, và tôi sẽ gõ GDB 151 00:07:21,674 --> 00:07:24,340 một lần nữa, để vào môi trường GDB, và tên của chương trình 152 00:07:24,340 --> 00:07:27,450 mà tôi muốn gỡ lỗi, buggy1. 153 00:07:27,450 --> 00:07:30,182 Chúng tôi nhận được một tin nhắn nhỏ, đọc biểu tượng từ buggy1, thực hiện. 154 00:07:30,182 --> 00:07:32,390 Tất cả điều đó có nghĩa là nó kéo cùng tất cả các mã, 155 00:07:32,390 --> 00:07:35,570 và bây giờ nó được nạp vào GDB, và nó sẵn sàng để đi. 156 00:07:35,570 --> 00:07:37,140 >> Bây giờ, những gì tôi muốn làm gì? 157 00:07:37,140 --> 00:07:39,130 Bạn có nhớ lại những gì Bước đầu tiên thường là 158 00:07:39,130 --> 00:07:42,540 sau khi tôi là bên trong của môi trường này? 159 00:07:42,540 --> 00:07:44,540 Hy vọng rằng, các bạn nói đặt một điểm break, vì 160 00:07:44,540 --> 00:07:46,240 trong thực tế, đó là những gì tôi muốn làm. 161 00:07:46,240 --> 00:07:47,990 Bây giờ, tôi không có mã nguồn cho điều này 162 00:07:47,990 --> 00:07:50,948 trước mặt tôi, mà có lẽ là không phải là trường hợp điển hình sử dụng, bằng cách này. 163 00:07:50,948 --> 00:07:52,055 Bạn có lẽ sẽ. 164 00:07:52,055 --> 00:07:52,680 Vì vậy, đó là tốt. 165 00:07:52,680 --> 00:07:55,790 Nhưng giả sử bạn không, những gì một trong những chức năng mà bạn biết 166 00:07:55,790 --> 00:07:58,880 tồn tại trong mọi chương trình C đơn? 167 00:07:58,880 --> 00:08:04,420 Không có vấn đề lớn như thế nào hoặc làm thế nào phức tạp đó là, chức năng này chắc chắn tồn tại. 168 00:08:04,420 --> 00:08:05,440 Chính, phải không? 169 00:08:05,440 --> 00:08:08,870 >> Vì vậy, không hết, chúng ta có thể thiết lập một điểm break ở chinh. 170 00:08:08,870 --> 00:08:12,200 Và một lần nữa, tôi chỉ có thể gõ phá vỡ chính, thay vì b. 171 00:08:12,200 --> 00:08:14,650 Và nếu bạn đang tò mò, nếu bạn từng loại ra một lệnh dài 172 00:08:14,650 --> 00:08:16,800 và sau đó nhận ra rằng bạn gõ sai việc gì, 173 00:08:16,800 --> 00:08:18,770 và bạn muốn được thoát khỏi của tất cả như tôi vừa làm, 174 00:08:18,770 --> 00:08:22,029 bạn có thể mất kiểm soát U, mà sẽ xóa tất cả mọi thứ và đưa bạn trở lại 175 00:08:22,029 --> 00:08:23,570 đến đầu của các dòng con trỏ. 176 00:08:23,570 --> 00:08:26,569 A nhanh hơn rất nhiều hơn là chỉ giữ xóa, hoặc đánh nó một lần bó 177 00:08:26,569 --> 00:08:27,080 trên. 178 00:08:27,080 --> 00:08:28,740 >> Vì vậy, chúng tôi sẽ thiết lập một điểm break ở chinh. 179 00:08:28,740 --> 00:08:32,970 Và như bạn thấy, nó nói rằng chúng ta đã thiết lập một điểm break ở tập buggy1.c, 180 00:08:32,970 --> 00:08:36,330 và dường như các dòng đầu tiên mã của chính là dòng bảy. 181 00:08:36,330 --> 00:08:38,080 Một lần nữa, chúng tôi không có các tập tin nguồn ở đây, 182 00:08:38,080 --> 00:08:40,429 nhưng tôi sẽ giả định rằng đó là nói thật. 183 00:08:40,429 --> 00:08:44,510 Và sau đó, tôi chỉ cố gắng và chạy chương trình, r. 184 00:08:44,510 --> 00:08:45,360 Bắt đầu chương trình. 185 00:08:45,360 --> 00:08:48,160 Tất cả các quyền, vì vậy thông điệp này là một chút khó hiểu. 186 00:08:48,160 --> 00:08:50,160 Nhưng về cơ bản những gì xảy ra ở đây là nó chỉ 187 00:08:50,160 --> 00:08:53,350 nói với tôi rằng tôi đã trúng giải lao của tôi điểm, điểm break số 1. 188 00:08:53,350 --> 00:08:55,877 >> Và sau đó, rằng dòng mã, không có tập tin hoặc thư mục. 189 00:08:55,877 --> 00:08:57,710 Lý do duy nhất mà Tôi nhìn thấy tin nhắn đó 190 00:08:57,710 --> 00:09:00,800 là vì tôi vô tình xóa file buggy.c của tôi. 191 00:09:00,800 --> 00:09:04,050 Nếu tập tin buggy1.c tôi tồn tại trong thư mục hiện hành, 192 00:09:04,050 --> 00:09:06,920 mà đúng tuyến có thực sự sẽ cho tôi biết những gì các dòng mã 193 00:09:06,920 --> 00:09:08,214 nghĩa đen lần đọc. 194 00:09:08,214 --> 00:09:09,380 Thật không may, tôi đã xóa nó. 195 00:09:09,380 --> 00:09:14,790 Chúng ta sẽ phải loại điều hướng thông qua điều này một chút mù quáng hơn. 196 00:09:14,790 --> 00:09:17,330 >> OK, vì vậy hãy xem, những gì Tôi muốn làm ở đây? 197 00:09:17,330 --> 00:09:21,770 Vâng, tôi muốn biết những gì địa phương các biến thể có sẵn cho tôi. 198 00:09:21,770 --> 00:09:23,570 Tôi đã bắt đầu chương trình của tôi. 199 00:09:23,570 --> 00:09:28,515 Chúng ta hãy xem những gì có thể được khởi tạo cho chúng ta. 200 00:09:28,515 --> 00:09:31,430 Tôi gõ Thông tin người dân địa phương, không có người dân địa phương. 201 00:09:31,430 --> 00:09:33,960 Tất cả các quyền, do đó không cho tôi một tấn thông tin. 202 00:09:33,960 --> 00:09:37,600 Tôi có thể thử và in ra một biến, nhưng tôi không biết bất cứ tên biến. 203 00:09:37,600 --> 00:09:39,930 Tôi có thể thử một dấu vết trở lại, nhưng tôi là bên trong của chính, 204 00:09:39,930 --> 00:09:43,710 vì vậy tôi biết tôi đã không được thực hiện một cuộc gọi chức năng ngay bây giờ. 205 00:09:43,710 --> 00:09:47,710 >> Vì vậy, có vẻ như lựa chọn duy nhất của tôi là sử dụng n hay như vậy và bắt đầu nhảy vào. 206 00:09:47,710 --> 00:09:49,630 Tôi sẽ sử dụng n. 207 00:09:49,630 --> 00:09:51,180 Vì vậy, tôi gõ n. 208 00:09:51,180 --> 00:09:53,060 Ôi chúa ơi, những gì đang xảy ra ở đây. 209 00:09:53,060 --> 00:09:56,260 Chương trình đã nhận được tín hiệu, SIGSEGV lỗi phân khúc, 210 00:09:56,260 --> 00:09:57,880 và sau đó một bó toàn bộ các công cụ. 211 00:09:57,880 --> 00:09:58,880 Tôi đã bị choáng ngợp. 212 00:09:58,880 --> 00:10:00,980 Vâng, có thực sự là một rất nhiều để được học ở đây. 213 00:10:00,980 --> 00:10:02,520 Vì vậy, điều này cho chúng ta biết? 214 00:10:02,520 --> 00:10:09,180 Những gì nó nói với chúng ta là, chương trình này là về đến, nhưng có chưa, lỗi seg. 215 00:10:09,180 --> 00:10:12,550 Và đặc biệt, tôi sẽ để phóng to hơn nữa ở đây, 216 00:10:12,550 --> 00:10:18,980 nó về để seg lỗi về một cái gì đó gọi là strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Bây giờ, chúng ta có thể không có thảo luận Chức năng này rộng rãi. 218 00:10:22,705 --> 00:10:25,580 Nhưng nó is-- vì chúng tôi sẽ không để nói về mọi chức năng mà 219 00:10:25,580 --> 00:10:28,610 tồn tại trong chuẩn C library-- nhưng tất cả đều có sẵn cho bạn, 220 00:10:28,610 --> 00:10:32,110 đặc biệt là nếu bạn có một nhìn vào reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Và strcmp là một thực sự mạnh mẽ chức năng tồn tại bên trong 222 00:10:35,000 --> 00:10:38,070 của tiêu đề string.h tập tin, mà là một tiêu đề 223 00:10:38,070 --> 00:10:41,970 tập tin đó là dành riêng cho chức năng mà làm việc và thao tác trên chuỗi. 224 00:10:41,970 --> 00:10:49,830 >> Và đặc biệt, những gì strcmp không là so sánh giá trị của hai chuỗi. 225 00:10:49,830 --> 00:10:54,160 Vì vậy, tôi về để Segmentation Fault một cuộc gọi đến strcmp nó có vẻ. 226 00:10:54,160 --> 00:10:58,530 Tôi nhấn n, và trong thực tế, tôi nhận được thông báo, Chương trình chấm dứt với tín hiệu SIGSEGV 227 00:10:58,530 --> 00:11:01,370 lỗi phân khúc. Vậy bây giờ Tôi thực sự đã seg đứt gãy, 228 00:11:01,370 --> 00:11:06,479 và chương trình của tôi có khá nhiều hiệu quả nhất định lên. 229 00:11:06,479 --> 00:11:07,770 Đây là phần cuối của chương trình. 230 00:11:07,770 --> 00:11:10,370 Nó phá vỡ, nó đã bị rơi. 231 00:11:10,370 --> 00:11:14,740 Vì vậy, không phải là rất nhiều, nhưng tôi thực sự đã tìm hiểu khá một chút 232 00:11:14,740 --> 00:11:16,747 từ kinh nghiệm này rất ít. 233 00:11:16,747 --> 00:11:17,580 Tôi đã học được những gì? 234 00:11:17,580 --> 00:11:22,020 Vâng, chương trình của tôi bị treo khá nhiều ngay lập tức. 235 00:11:22,020 --> 00:11:26,300 Chương trình của tôi bị treo trên một cuộc gọi để strcmp, nhưng tôi 236 00:11:26,300 --> 00:11:30,560 không có bất kỳ biến địa phương trong tôi chương trình tại thời điểm mà nó bị treo. 237 00:11:30,560 --> 00:11:37,320 Vì vậy, những gì string, dây, Tôi có thể có thể được so sánh. 238 00:11:37,320 --> 00:11:42,140 Nếu tôi không có bất kỳ địa phương biến, có lẽ bạn 239 00:11:42,140 --> 00:11:45,520 Tôi phỏng đoán rằng có lẽ have-- là một biến toàn cầu, trong đó có thể đúng. 240 00:11:45,520 --> 00:11:47,670 >> Nhưng nói chung, có vẻ như như tôi đang so sánh 241 00:11:47,670 --> 00:11:52,070 để cái gì đó không tồn tại. 242 00:11:52,070 --> 00:11:54,130 Vì vậy, đi điều tra mà xa hơn một chút. 243 00:11:54,130 --> 00:11:55,120 Vì vậy, tôi sẽ để xóa màn hình của tôi. 244 00:11:55,120 --> 00:11:57,536 Tôi sẽ bỏ ra khỏi Môi trường GDB trong một giây. 245 00:11:57,536 --> 00:12:01,300 Và tôi nghĩ, OK, vì vậy có không có biến cục bộ trong chương trình của tôi. 246 00:12:01,300 --> 00:12:06,444 Tôi tự hỏi nếu có lẽ tôi phải vượt qua trong một chuỗi như là một đối số dòng lệnh. 247 00:12:06,444 --> 00:12:07,610 Vì vậy, chúng ta hãy chỉ kiểm tra này ra. 248 00:12:07,610 --> 00:12:09,020 Tôi đã không làm điều này trước. 249 00:12:09,020 --> 00:12:14,244 >> Hãy xem nếu có thể nếu tôi chạy chương trình này với một đối số dòng lệnh nó hoạt động. 250 00:12:14,244 --> 00:12:16,140 Huh, không có lỗi trong phân khúc đó. 251 00:12:16,140 --> 00:12:17,870 Nó chỉ nói với tôi rằng tôi đã tìm nó ra. 252 00:12:17,870 --> 00:12:19,170 Vì vậy, có lẽ đó là sửa chữa ở đây. 253 00:12:19,170 --> 00:12:27,560 Và quả thực, nếu tôi quay lại và nhìn vào mã nguồn thực tế cho buggy1.c, 254 00:12:27,560 --> 00:12:31,180 nó có vẻ như là mặc dù những gì tôi đang làm là Tôi đang thực hiện một cuộc gọi đến mà không strcmp 255 00:12:31,180 --> 00:12:34,010 kiểm tra cho dù trên thực tế argv [1] tồn tại. 256 00:12:34,010 --> 00:12:36,730 Đây thực sự là mã nguồn cho buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Vì vậy, những gì tôi thực sự cần phải làm ở đây để sửa chữa chương trình của tôi, 258 00:12:38,855 --> 00:12:40,835 giả sử tôi có nộp trước mặt tôi, là 259 00:12:40,835 --> 00:12:44,740 chỉ cần thêm một kiểm tra để đảm chắc chắn rằng argc là bằng 2. 260 00:12:44,740 --> 00:12:47,780 Vì vậy, ví dụ này, một lần nữa, như tôi đã nói, là một chút giả tạo, phải không? 261 00:12:47,780 --> 00:12:49,840 Bạn thường sẽ không vô tình xóa mã nguồn của bạn 262 00:12:49,840 --> 00:12:51,820 và sau đó phải cố gắng và gỡ lỗi chương trình. 263 00:12:51,820 --> 00:12:53,120 Nhưng hy vọng rằng, nó đã cho bạn một minh họa 264 00:12:53,120 --> 00:12:55,120 của các loại của những điều mà bạn có thể suy nghĩ về 265 00:12:55,120 --> 00:12:56,610 như bạn gỡ lỗi chương trình của bạn. 266 00:12:56,610 --> 00:12:58,760 >> Trạng thái của vấn đề ở đây là gì? 267 00:12:58,760 --> 00:13:00,510 Những gì tôi làm biến có thể truy cập với tôi? 268 00:13:00,510 --> 00:13:03,600 Trường hợp chính xác là chương trình của tôi đâm, vào những gì dòng, 269 00:13:03,600 --> 00:13:05,240 về những gì gọi với những gì chức năng? 270 00:13:05,240 --> 00:13:06,952 Những loại manh mối nào đó cho tôi? 271 00:13:06,952 --> 00:13:08,910 Và đó là chính xác loại tư duy mà bạn 272 00:13:08,910 --> 00:13:12,820 nên được nhận vào khi bạn suy nghĩ về gỡ lỗi chương trình của bạn. 273 00:13:12,820 --> 00:13:13,820 >> Tôi Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Đây là CS50. 275 00:13:16,140 --> 00:15:08,642