[? DAN ARMADARAS:?] Hi, Tôi [? Dan Armadaras?]. Hôm nay, chúng ta sẽ được xem xét gỡ lỗi. Không những chúng ta sẽ nói về một số kỹ thuật, nhưng cũng có thể chúng ta sẽ xem xét ở một số tính năng chứa trong IDE CS50 cho phép bạn dễ dàng gỡ lỗi một chương trình. Chỉ cần một ví dụ về một cái gì đó mà có thể đi sai và nó thực sự là một cái gì đó rằng chúng ta đã thấy trước đây. 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, chia nó bằng hai, và cung cấp sản lượng trở lại cho người sử dụng. Bây giờ những gì chúng ta đã nhìn thấy trước đó trong bài giảng, 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 khi chúng tôi có số lẻ. Cụ thể, chúng tôi sẽ chỉ vứt đi bất cứ điều gì sau dấu thập phân. Bây giờ, chúng ta biết rằng điều này xảy ra là các trường hợp. 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. Và sau đó, bằng cách chạy và nhập một số lẻ. Điều này không có gì mới. Nhưng điều này thực sự là một ví dụ về một lỗi 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. Mặc dù chúng tôi biết những gì vấn đề là, mấu chốt của vấn đề đúng có thể cố gắng để xác định đặc biệt nơi các lỗi xảy ra, xác định những vấn đề mà là, và sau đó sửa chữa nó. 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ì đó 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ã. Vì vậy, mở nguồn khác này mã tập tin như là một ví dụ, 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. Vẫn có thể là một chút bit trù định, và chúng tôi có thể có thể dễ dàng xác định nó, đặc biệt kể từ khi chúng tôi chỉ thảo luận này. 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. Nếu tôi biên dịch này và bây giờ chạy nó, nhập một số lẻ, 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. Trong trường hợp cụ thể này, chúng ta có thể nói rằng chúng tôi muốn đếm tất cả các con số từ một đến một số số cụ thể. Và chúng ta có thể thấy rằng chúng ta có một loạt các vấn đề ở đâ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. Vì vậy, chúng tôi đã biết rằng có một vấn đề ở đây. 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. 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 là điều mà chúng tôi đã đã được giới thiệu. Chúng tôi chỉ có thể sử dụng nó trên một quy mô lớn hơn. On line 14, chúng tôi có hàm printf này, cho phép chúng ta in ra nhà nước các thông tin khác nhau. 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 để cố gắng tìm ra chính xác những gì xảy ra ở nhiều dòng mã. 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ự muốn sản xuất ra của chương trình này, chúng tôi vẫn có thể có một số debug báo cáo, nơi chúng tôi 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. Vì vậy, trong trường hợp này, tôi sẽ printf với tag debug. Trong trường hợp này, đây là chỉ là một chuỗi debug 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 nó là gì mà tôi muốn thể hiện. Và đầu ra ở đây số rằng chúng tôi đã tính toán. Trong trường hợp này, tôi có thể muốn biết chính xác những gì đang xảy ra trước và sau khi một số tính toán cụ thể. Vì vậy, tôi có thể sử dụng một printf trước và sau đó dòng mã. 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 bằng cách nói debug trước và debug sau quá 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. 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, 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 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 rằng chúng tôi thực sự muốn làm. 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. 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. Và đây là, một lần nữa, một chút trù định. 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 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, 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ể làm điều đó điều đặc biệt, trong trường hợp này. 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. Hãy biên dịch lại này và xác nhận rằng đây được hành xử theo cách mà chúng ta muốn. Chúng ta có thể thấy rằng bây giờ trước có, chúng tôi có số lượng 5. 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, là những gì chúng tôi muốn làm. Nhưng nếu chúng ta nhìn vào đầu ra ở đây, chúng ta có thể thấy rằng chúng tôi có thể có một lỗi hoàn toàn, đó là rằng chúng ta đang bắt đầu đếm của chúng tôi từ 0. 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ứ và chúng tôi có thể sửa chữa khá dễ dàng. Nhưng trong trường hợp này, chúng tôi cũng có lợi ích 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 để biết chính xác nơi lỗi đã xảy ra. Vì vậy, báo cáo printf rất hữu ích trong việc giúp đỡ bạn xác định nơi, chính xác trong mã nguồn của bạn, một lỗi cụ thể đang xảy ra. Và nó cũng quan trọng để nhận ra rằng, khi chúng tôi đang viết code, chúng ta có thể có những giả định về tình trạng của một chương trình. 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 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 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 mà chúng ta nhận ra rằng một số khía cạnh đó thực sự là lỗi. Sử dụng printf thực sự có thể giúp thu hẹp và xác định 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 mong đợi, dựa trên những giả định của chúng tôi. Nhưng có các công cụ khác có sẵn, cũng như, cho phép chúng ta cố gắng để con số ra nơi một lỗi xảy ra 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. Vì vậy, sử dụng printf là rất khi hữu ích, chúng tôi muốn để xác định các khu vực cụ thể của một chương trình có một số lỗi. Nhưng nó cũng trở thành tẻ nhạt sau một thời gian. Trong trường hợp này, đây là một chương trình tương đối đơn giản chỉ với một hoặc hai biến. 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 trong bối cảnh các chương trình lớn hơn. Nhưng chúng ta có thể có một khác nhau Chương trình có nhiều biến. Và nó có thể không được khá rất dễ dàng để sử dụng printf để cố gắng đánh giá những gì đang xảy ra cho mỗi một trong những biến như các chương trình được thực hiện. 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. 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, 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 cách chi tiết. Chúng tôi thực sự có thể thực hiện GDB từ dòng lệnh ở đây chỉ đơn giản bằng cách gõ GDB và lệnh mà chúng ta muốn gỡ lỗi. Trong trường hợp này, đếm. 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. Và chúng ta có thể thực sự thực hiện các lệnh để GDB để 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, đánh giá các biến và kiểm tra các biến tồn tại trong các chương trình nhà nước tại thời điểm đó cụ, và vv và vv. Nó cung cấp rất nhiều năng lượng cho chúng ta. Nhưng nó chỉ như vậy sẽ xảy ra mà IDE cũng CS50 cung cấp một giao diện đồ họa hoặc một người dùng giao diện cho GDB mà 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 hoặc ở tất cả thậm chí. 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 ở đầu rất của IDE CS50. 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 dòng để biên dịch và sau đó chạy một chương trình. Các nút gỡ lỗi không cả của những người bước. Nhưng nó cũng sẽ mang đến những tab trình gỡ lỗi trên bên phải 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 vì nó được thực hiện. Nếu tôi nhấp debug, trong này trường hợp, nó sẽ mang đến một tab mới trong giao diện điều khiển cửa sổ ở dưới cùng rất. Và bạn có thể thấy tab này có một số thông tin ở đầu rất. Và chúng ta phần lớn có thể bỏ qua điều này. Nhưng một trong những điều mà chúng tôi muốn thông báo là kết quả đầu ra cùng một điều mà chúng tôi 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. Ở đây, chúng ta có thể thấy nó đang chạy kêu vang, và nó có nhiều cờ, 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 đó mà tôi nhấn debug. 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, 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ự muốn chạy. Một trong những lá cờ đó là quan trọng, trong trường hợp này, chúng tôi đã thực sự được sử dụng cho thời gian lâu nhất nhưng cũng chỉ làm một số tay vẫy [Không nghe thấy], mà là một trong những điều này ngay tại đây. Trong vang, nó nói -ggdb3. 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, là chúng ta muốn biên dịch chương trình của chúng tôi. Nhưng cũng cung cấp là gì được gọi là thông tin biểu tượng để 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 chứa trong các chương trình. Cụ thể hơn, số các chức năng mà tôi có, tên của những chức năng, các biến, các loại rằng những biến là, và một loạt những thứ khác mà giúp gỡ rối thực hiện các hoạt động của nó. Bây giờ có cái gì khác đó là quan trọng để đề cập đến 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. 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 dọc theo phía dưới. Chúng tôi không còn phải tương tác trực tiếp với cửa sổ terminal. Nhưng tab mới này là thực sự là một cửa sổ terminal. Nó chỉ là cụ thể cho các hoạt động chương trình mà chúng tôi đã tạo ra. Chú ý rằng ở phía dưới, trong kết hợp với một số đầu ra bởi Clang trình biên dịch và GDB, mà chúng ta phần lớn có thể bỏ qua, 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. 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ự sẽ hiển thị cho bạn đầu ra từ chương trình của bạn nhưng cũng có thể chấp nhận đầu vào cho chương trình đó, là tốt. Vì vậy, thông báo nói rằng vui lòng nhập một số, đó là đầu ra tương tự mà chúng tôi đã có đã có trong cửa sổ terminal trước. Nhưng nó bây giờ được hiển thị trong tab mới này. Tôi có thể nhập vào một số. Và nó sẽ thực sự chức năng như chúng tôi mong đợi cho chúng ta thấy debug của chúng tôi, sản lượng, đầu ra có thể có lỗi, như chúng ta đã thấy trước đây. Và ở rất dưới, nó thực sự có một số sản lượng thêm từ GDP chỉ nói rằng Chương trình này đã hoàn thành. Bây giờ như bạn đã thấy trong này chạy cụ thể thông qua, nó không phải là đặc biệt hữu ích bởi vì ngay cả 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. 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 để có thể kiểm tra tất cả các các biến chứa bên trong. Có cái gì khác rằng chúng ta phải làm theo thứ tự để 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 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. Để tạm dừng thực hiện, tại một số dòng cụ thể, chúng ta cần phải tạo ra những gì được gọi là một điểm break. 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 và nhấp trực tiếp vào bên trái của một số dòng số cụ thể. Khi tôi làm điều đó, một chấm đỏ xuất hiện, mà chỉ ra mà dòng mà bây giờ là một điểm break. Và lần sau đó tôi chạy GDB, nó sẽ ngừng thực hiện ở thời điểm nghỉ khi nó đạt đến dòng mã. Bây giờ đây là một quan trọng điều để nhận ra rằng nó không nhất thiết phải là trường hợp đó mỗi dòng mã thực sự là có thể truy cập. Nếu tôi là để tạo ra một chức năng lên đây, cho example-- trống f-- 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, nó sẽ được các trường hợp đó, nếu tôi đặt một điểm break ở đây, chức năng sẽ không bao giờ được gọi. Và do đó, điều này điểm break đặc biệt sẽ không bao giờ thực sự tạm dừng thực hiện chương trình. 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ã mà thực sự sẽ được thực thi. 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. 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, dòng đầu tiên sẽ đạt được. GDB sẽ tạm dừng thực hiện. Và sau đó, tôi sẽ có thể tương tác với trình gỡ rối. Bạn có thể thiết lập nhiều dòng như breakpoint, nếu bạn muốn. 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ã rằng sẽ không bao giờ đạt được. Và chúng ta cũng có thể thiết lập một chi tiết dưới đây. Lý do mà chúng ta sẽ muốn làm điều này chúng ta sẽ đi vào một chút nữa chi tiết chỉ trong một khoảnh khắc. Vì vậy, bây giờ, hãy để tôi chỉ vô hiệu hóa những điểm break thêm để 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 điểm trong chương trình của tôi. Tôi đã thực hiện một số thay đổi cho chương trình này. Vì vậy, tôi cần phải lưu nó. Tôi sẽ bấm debug để tôi có thể bắt đầu việc xây dựng và sau đó thực hiện các chương trình gỡ rối. Chúng ta sẽ thấy rằng, sau thời gian ngắn, dòng mà chúng chọn là giờ nghỉ điểm được đánh dấu màu vàng. 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 mà biểu tượng tạm dừng đã biến thành một biểu tượng play chút. Đ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. Và nhấn nút Play sẽ cho phép chúng tôi tiếp tục thực hiện ở thời điểm cụ thể. Chú ý rằng có một vài khác các nút có sẵn trong bảng debug này, cũng. Bước qua, cho phép tôi để thực hiện mà một dòng mã và bước qua đó dòng vào Người tiếp theo, trong đó, trong trường hợp này, sẽ có nghĩa là printf statement được thực hiện. Và sau đó nó sẽ tạm dừng thực hiện trên dòng 13, như vậy. Và đó cũng là một bước vào chức năng, trong đó 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. Và tôi muốn bước vào những chức năng hơn thực hiện chức năng như một toàn thể. 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. 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. Chúng tôi có bảng này được gọi là gọi chồng, mà cho chúng ta thấy nơi chính xác chúng ta đang có. Trong trường hợp này, chúng ta đang ở trong các chức năng chính. Kịch bản của chúng tôi được gọi là count.c. Và chúng tôi xảy ra được trên dòng 13, cột một, mà 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. Bây giờ để ý rằng điều này cũng cho thấy dưới phần biến địa phương tất cả các biến số tồn tại trong chức năng này. Điều quan trọng cần lưu ý rằng tất cả các biến sẽ xuất hiện trong biến địa phương này phần trong một hàm, ngay cả trước khi chúng được định nghĩa. 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, và nó sẽ là kiểu int. Bây giờ trước khi chúng tôi thực sự khởi tạo tất cả các biến, chúng tôi không nhất thiết phải bảo đảm để nhìn thấy một giá trị 0. Và tùy thuộc vào hành khác mà bạn đã thực hiện 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, bạn có thể thấy rằng bạn không thấy giá trị của 0 và, thay vào đó, một số con số điên khác. Nhưng đừng lo lắng về điều đó. Nó sẽ không có liên quan đến bạn thực sự khởi tạo giá trị. 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. Và tôi, ngay bây giờ, tạm dừng thực hiện. Nhưng trong trường hợp này, những gì Tôi thực sự muốn làm là đến nay bước qua dòng này mã để tôi có thể thực sự 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. Bây giờ trong trường hợp này, khi Tôi nhấn bước qua, thông báo rằng Pause hay đúng hơn là Resume nút đã thay đổi để nút Pause này vì mã này được thực thi. Chuyện gi đang xảy ra đúng là bây giờ mà nó là 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 ở đáy. Vì vậy, ngay bây giờ, đây là không thực sự dừng lại, mặc dù nó, loại, xuất hiện là vì không có gì đang xảy ra. 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, Tôi đang chờ đợi cho người dùng nhập vào. Và như vậy GDB là không thể kiểm tra một chương trình khi nó đang chạy. 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, như chúng ta đã thấy trong các past-- nhấn trở lại, và chúng tôi 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. 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ị, 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, là rất hữu ích để biết chính xác những con số này là trong bộ nhớ. 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ó bằng cách nhấn Resume. 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 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, và bây giờ chương trình này đã ngừng hoàn toàn. Tôi thấy chỉ cho mục đích của những gì nhìn thấy xảy ra khi chúng ta thực sự nhấn Resume. Nhưng chúng tôi thực sự đang đi muốn trở lại vào chương trình này để chúng ta có thể cố gắng để gỡ lỗi chính xác những gì đang xảy ra. 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. 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 rằng chúng tôi đã có một thời gian trước đây. Bây giờ khi tôi lưu chương trình và thực hiện nó, 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. Và tôi sẽ có thể kiểm tra biến tôi như tôi muốn làm. 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ị, Và tôi biết rằng tôi sẽ để in ra tuyên bố này. Vui lòng nhập một số. Và sau đó, tôi biết rằng tôi sẽ để yêu cầu người dùng cho số nguyên đó. 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. 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 bên trái của con số dòng. Đó là dấu chấm màu đỏ sẽ biến mất, chỉ ra rằng điểm break là bây giờ đi. Bây giờ trong trường hợp này, thực hiện đã được tạm dừng. Và do đó, nó không thực sự đi vào nối lại vào đó ví dụ cụ thể. Nhưng tôi có thể thiết lập ngắt chỉ một chút sau đó. Và khi bây giờ tôi trở lại của tôi code, nó sẽ tiếp tục và nói điểm mà điểm break. Một lần nữa, tôi nhấn Resume. Không có vẻ như bất cứ điều gì đang xảy ra. Nhưng đó là bởi vì tôi đang chờ đợi đầu vào. 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. Bây giờ trong trường hợp này, điều này là các dòng mã rằng, trước đây, chúng tôi đã biết đã xảy ra được lỗi. 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. Khi một dòng được nhấn mạnh, điều này đường vẫn chưa được thực thi. 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à Tôi có một số nguyên được gọi là num mà có giá trị 5. Và tôi sẽ thực hiện một số môn toán trên con số đó. Nếu tôi bước qua đó, chúng ta có thể nhận thấy rằng giá trị cho num đã thay đổi theo số học mà chúng tôi đã thực sự thực hiện. Và bây giờ chúng ta là bên trong này cho vòng lặp hay bây giờ mà cho vòng lặp chính nó được đánh dấu, chúng ta thấy rằng chúng tôi có một mới biến gọi là i rằng sẽ được sử dụng trong đó cho vòng lặp. Bây giờ hãy nhớ rằng trước khi tôi nói rằng đôi khi bạn sẽ thấy một số loại điên số như mặc định trước khi con số đó hoặc biến đó là thực sự khởi tạo. Chúng ta có thể thấy rằng chính xác ở đây trong biến này gọi tôi, trong đó có không chưa được khởi tạo đồng thời làm nổi bật. 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. Vậy là được rồi. Đừng lo lắng về nó bởi vì chúng tôi đã không thực sự khởi tạo số cho rằng, cho đến khi tôi bước qua dòng này và giá trị i đã được khởi tạo với giá trị 1. 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. Bây giờ chúng ta có thể thấy rằng dòng đã được thực thi. Và bây giờ chúng ta đang làm nổi bật dòng printf này. 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. Đ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. 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 và những gì sẽ xảy ra với các các biến bên trong đó cho vòng lặp như thực hiện chương trình xảy ra một bước tại một thời điểm. Bây giờ vào thời điểm này, tôi bước qua chỉ đủ rằng tôi bây giờ là ở phần cuối của chương trình của tôi. Nếu tôi bước trên đó, nó sẽ thực sự chấm dứt thực hiện như chúng ta đã thấy trong quá khứ. 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, cũng. Trong trường hợp này, nó là Bây giờ hỏi tôi, một lần nữa, cho một con số, Tôi sẽ, một lần nữa, nhập. 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 sẽ lặp lại lần nữa. Trong trường hợp này, tôi sẽ để nhập giá trị 11. 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, nó sẽ làm nổi bật dòng đó. Chúng ta có thể thấy rằng chúng tôi số 11 là đúng đại diện trong các biến địa phương của chúng tôi. 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 khi chúng tôi tiến bên trong này cho vòng lặp. Nó được tăng lên mỗi lần chúng tôi đạt đến đỉnh của đó cho vòng lặp. 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 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 những gì xảy ra với chương trình của tôi. Trong trường hợp này, tôi thực sự có thể nhấn đúp chuột vào giá trị. Chú ý rằng nó sẽ trở thành một lĩnh vực văn bản. Bây giờ tôi có thể nhập khác nhau giá trị hoàn toàn để xem cách ứng xử chương trình của tôi khi tôi đã thay đổi biến đó. Bây giờ trong trường hợp này, biến tôi bây giờ có giá trị 10. Nhưng chương trình vẫn là dừng lại trong thực hiện. Khi tôi bước qua, tôi thấy rằng các giá trị i, mà tôi nhập là 10, 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 để ngăn chặn thực thi. Bây giờ không phải là duy nhất Lý do tại sao bạn sẽ muốn thay đổi các biến tại chỗ. Bạn thực sự có thể muốn để cố gắng sửa đổi nó để mà bạn có thể tiếp tục thực hiện một vòng lặp hay như vậy mà bạn có thể sửa đổi một số giá trị trước khi nó đạ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. 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, 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 đã xảy ra để được lớn hơn giá trị của num, có nghĩa là cho rằng vòng lặp không còn cần thiết để được thực thi. Hơn nữa, nó đã xảy ra là trường hợp đó chúng tôi thay đổi giá trị của i khi đường 17 đã được đánh dấu, đó là điểm trong thời gian rằng để thực hiện vòng lặp đã thực sự được đánh giá. Nếu tôi đã thay đổi giá trị của i trên một dòng khác nhau, nói 19, chúng tôi đã thấy khác nhau hành vi vì dòng 19 sẽ đã thực hiện trước khi vòng lặp điều kiện được đánh giá lại. 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. 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. Nhưng có một vài điều đó là quan trọng để lấy đi từ cuộc thảo luận đặc biệt này. Bạn cần phải đánh giá giả định của riêng bạn về cách mã nên được hành xử. 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, đó có thể là một lá cờ đỏ để đi trở lại và đánh giá, và chắc chắn rằng giả định của bạn cách mã đang hoạt động là thực sự đúng với nó như thế nào trong mã nguồn của bạn. 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, bạn có thể đặt breakpoint tại dòng khác nhau của mã, 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 do đó bạn có thể đánh giá bộ nhớ hoặc thậm chí thay đổi nó tại chỗ. Và một lần nữa, hãy nhớ rằng bạn có thể tạo nhiều breakpoint để bạn cũng có thể tiếp tục thực hiện, bỏ qua trên phần lớn các mã, và nó sẽ tự động tạm dừng tại các điểm nghỉ tiếp theo. 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. Nhưng chúng tôi muốn giới thiệu bạn để một số video tiếp theo để thực sự trêu chọc nhau như thế nào để sử dụng những chức năng đặc biệt. Để bây giờ, cảm ơn bạn rất nhiều để xem. Và may mắn gỡ lỗi.