[Powered by Google Translate] GDB, các dự án GNU Debugger, là một công cụ sửa lỗi mạnh mẽ cho C, cùng với nhiều ngôn ngữ khác. Nó cho phép bạn poke xung quanh bên trong chương trình C của bạn trong khi họ đang thực hiện, và nó cũng mang đến cho bạn cơ hội để xem chính xác những gì sẽ xảy ra khi chương trình của bạn bị treo. Nó khá tiện lợi, phải không? GDB là phần mềm miễn phí, và nó chạy trên nhiều phổ biến UNIX và Hệ điều hành dựa trên Windows, vì vậy nó là một công cụ rất phổ biến. Bạn nên học cách thích nó. Ưu GDB có một thời gian dễ dàng hơn nhiều theo dõi xuống lỗi hơn so với những người muddle thông qua việc sử dụng dự đoán và vô hạn số lượng bản in báo cáo. GDB là một công cụ dòng lệnh, có nghĩa là bạn có thể tương tác với nó trong một thiết bị đầu cuối ban hành các lệnh thông qua bàn phím thay vì các nút cách nhấn vào với con chuột của bạn. Để khởi động GDB, bạn có nghĩa là chỉ cần gõ gdb tại dấu nhắc và nhấn Enter. Bạn sẽ thấy một số dòng in ra màn hình hiển thị cho bạn các phiên bản của GDB rằng bạn đang chạy, thông tin bản quyền, và cuối cùng bạn sẽ thấy dấu nhắc GDB: (gdb). Điều này cho phép bạn biết rằng GDB đã sẵn sàng cho các lệnh. Tại thời điểm này, điều quan trọng nhất để biết làm thế nào để làm là bỏ thuốc lá. May mắn thay, điều này là khá đơn giản. Dùng lệnh quit hiện điều đó. Như một phím tắt, bạn chỉ có thể sử dụng q. Là thú vị như khởi động GDB và sau đó nhanh chóng bỏ, Bây giờ chúng ta hãy nói về việc sử dụng GDB để giúp gỡ bỏ một chương trình. Để bắt đầu, tôi đã có một chương trình ở factorial.c mà được một int và cố gắng để tính toán giai thừa của nó. Trong trường hợp bạn không nhìn thấy factorials trước hoặc không nhớ chúng, Giai thừa của số n bằng sản phẩm của n (n - 1), (n - 2), và như vậy - cho đến khi bạn nhấn 1. Vì vậy, giai thừa của 3 là 3 * 2 * 1, 6, và thừa của 4 là 4 * 3 * 2 * 1 hoặc 24. Giai thừa của số không là một trường hợp kỳ lạ, nó là 1, và thừa số nguyên âm không được định nghĩa. Dù sao, một cái gì đó về chương trình thừa của tôi là funky. Khi tôi chạy nó, nó in ra số lạ mà không có gì để làm với factorials. Vì vậy, chúng ta có thể sử dụng gdb để giúp tìm ra những gì đang xảy ra. GDB hoạt động trên các tập tin thực thi, đó là các tập tin nhị phân được sản xuất bởi quá trình biên dịch. Đó là, chúng ta không có thể chạy GDB trên c của chúng tôi hoặc h tập tin mã nguồn như factorial.c. Chúng tôi muốn chạy nó trên chỉ là thừa. Nếu chương trình yêu cầu bất kỳ đối số dòng lệnh, đây là nơi mà chúng tôi muốn xác định chúng. Trong trường hợp này, thừa không yêu cầu bất kỳ đối số dòng lệnh, vì vậy chúng tôi chỉ cần gõ chạy hoặc r cho ngắn. Điều này sẽ bắt đầu chạy chương trình thừa. Khi chương trình ngừng chạy, tôi sẽ nhận được GDB của tôi nhắc lại. Được rồi, chúng ta hãy thử cùng một điều một lần nữa, thừa của 4. Được rồi, chúng ta thấy rằng chúng tôi đang nhận được cùng một loại rác ở đây trong GDB. Bây giờ chương trình đã kết thúc, chúng ta không thể đi vào và truy cập vào bất kỳ trạng thái của nó, vì vậy chúng ta cần phải bắt đầu nó chạy lại trước khi chúng ta có thể xem những gì đang xảy ra. Tuy nhiên, chúng ta cần một cách để ngăn chặn nó trong khi nó ở giữa chạy của nó. Để làm được điều đó, chúng tôi sử dụng những gì được gọi là một điểm dừng. Breakpoints nói với GDB để tạm dừng chương trình tại một chức năng cụ thể hoặc dòng mã nguồn để chúng tôi có thể kiểm tra trạng thái của chương trình, các giá trị của biến, nhà nước của bộ nhớ và như vậy, tại thời điểm đó. Vì tôi không thực sự biết nơi mà mọi thứ đang đi sai, Tôi chỉ muốn bắt đầu gỡ lỗi ngay từ đầu rất, ngay khi chính bắt đầu. Chúng tôi sẽ thiết lập một breakpoint ở đầu chính bằng cách sử dụng lệnh break. Chúng tôi cũng có thể sử dụng b viết tắt nghỉ. Bây giờ chúng ta hãy bắt đầu chương trình chạy lại. Ở đây chúng tôi là vào lúc bắt đầu của chính, giống như GDB cho chúng ta biết. Các dòng mã đó là về để thực hiện nhưng vẫn chưa là dòng printf. Chúng ta có thể nói với GDB để thực thi dòng mã này và đi đến dòng kế tiếp với lệnh tiếp theo hoặc n. Được rồi, bây giờ GDB cho chúng ta biết rằng chúng ta đang ở trên đường getInt. Tôi biết rằng nó có vẻ giống như các dòng printf không chạy kể từ khi chúng tôi không nhìn thấy "Nhập một số nguyên dương" in ra trên màn hình, nhưng nó đã thực sự chạy. Những gì chúng ta đang thấy là hệ điều hành ngăn chặn bất cứ điều gì bằng văn bản vào màn hình cho đến khi nó hoàn toàn có, lý do tại sao gỡ lỗi với bản in dường như đôi khi có thể không đáng tin cậy. Dù sao, chúng ta hãy một lần nữa đi vào dòng tiếp theo của mã và nhập vào trong một int. Một lần nữa, chúng ta hãy loại 4. Vì vậy, điều này có vẻ kỳ lạ. Chúng tôi đang ở trên dòng 12 theo GDB, nhưng dòng tiếp theo đó là về để thực hiện chỉ là một cú đúp xoăn. Điều đó chỉ có nghĩa là chúng ta đang ở cuối của một vòng lặp, chúng tôi làm vòng lặp trong khi trên thực tế, và GDB được cho chúng ta biết điều kiện chấm dứt, cụ thể là không có ít hơn không, sẽ thực hiện tiếp theo. Nếu đây bao giờ được một chút bối rối, chúng ta có thể kéo lên mã nguồn GDB với danh sách hoặc lệnh l. Này in ra mã nguồn đó là tập trung vào dòng mà chúng tôi hiện đang trên. Nếu chúng ta nhập danh sách hoặc l một lần nữa, chúng tôi sẽ xem tập tiếp theo của dòng in ra. Chúng ta có thể làm điều này cho đến khi chúng tôi nhấn cuối của tập tin. Để quay trở lại nơi chúng tôi đã, chúng tôi có thể cung cấp danh sách với một số dòng, trong trường hợp này, dòng 12. Dù sao, chúng ta hãy chuyển. Bây giờ chúng ta đang ở trên vòng lặp 4. Hãy chắc chắn rằng biến num của chúng tôi bao gồm 4. Chúng tôi làm điều này với in ấn, hoặc p, lệnh. Vì vậy, GDB cho chúng ta biết rằng num thực sự là lưu trữ 4, như chúng ta mong đợi. $ 1 GDB mà in ra là một biến GDB đặc biệt được thiết lập để lưu trữ 4 số. Bạn có thể bỏ qua điều này cho bây giờ, nhưng các biến GDB đến siêu tiện dụng trong trường hợp tiên tiến hơn khi bạn muốn nhớ lại những gì bạn đã làm trong quá khứ. Dù sao, di chuyển trên với tiếp theo, chúng ta thấy rằng chúng tôi bắt đầu di chuyển qua cho vòng lặp. Hãy giữ đi qua ở đây với n bit by bit. Thay vì gõ n mỗi lần, bạn cũng có thể chỉ cần nhấn Enter. Khi bạn nhấn Enter mà không cần gõ bất cứ điều gì, GDB chỉ lặp đi lặp lại các lệnh trước đó. Vì vậy, bây giờ chúng tôi đã đạt các cuộc gọi printf. Có vẻ như chúng tôi đã thực sự đi qua của chúng tôi cho vòng lặp 4 lần, đó là những gì chúng tôi muốn làm để nhân 1, 2, 3, và 4. Tất cả mọi thứ có vẻ như nó làm việc, trừ khi chúng ta nhấn Next một lần nữa, chúng tôi nhận được số lượng lớn thay vì 24. Nếu chúng tôi in ra các giá trị của p sử dụng thừa, chúng ta thấy rằng nhân tố không có số lượng lớn trong đó. Một cái gì đó chắc chắn sẽ sai. Tại thời điểm này, mặc dù, chúng tôi hầu như ở phần cuối của chương trình, và nó đã quá muộn để sửa chữa bất cứ điều gì. Tuy nhiên, chúng ta có thể khởi động lại chương trình bằng cách gõ r một lần nữa và sau đó y để xác nhận. Bây giờ chúng ta đang trở lại tại điểm dừng của chúng tôi vào lúc bắt đầu của chính. Chúng ta biết rằng tất cả mọi thứ có vẻ là tốt với đọc trong n. vì vậy chúng tôi có thể nhảy tiếp với n. Ngoài ra, chúng ta có thể thiết lập một breakpoint mới sau khi làm trong khi vòng lặp và nhảy. Hãy làm điều đó. Hình như dòng 14 đến sau khi vòng lặp. Hãy thiết lập một breakpoint ở đó. Rất tốt thực hành để chỉ định tên tập tin trong lệnh này breakpoint kể từ GDB có thể bị lẫn lộn nếu bạn đang làm việc với nhiều file. Để di chuyển tới này breakpoint, chúng tôi sẽ sử dụng tiếp tục hoặc lệnh c. Được rồi, ở đây chúng ta đang ở cho vòng lặp. Hãy thêm dòng 1 vào cho vòng lặp, và sau đó chúng tôi sẽ bắt đầu biến in ấn để xem những gì đang xảy ra. Hãy làm cho chắc chắn rằng tôi thực sự là 1, như mong đợi. Yup, đó là tất cả tốt. Những gì về thừa mặc dù? Whoa, đó là không tốt. Chúng tôi đã có một số lượng lớn tiêu cực ở đây. Tại sao vậy? Vâng, nếu chúng ta nhìn lại vào mã, chúng ta thấy rằng chúng ta không bao giờ khởi tạo nó, vì vậy chúng tôi đã chỉ cần có thùng rác trong đó. Điều đó chắc chắn sẽ ném tính toán của chúng tôi. May mắn thay, chúng tôi không phải rời khỏi GDB để sửa lỗi này. Chúng ta có thể khởi tạo nó ngay tại đây và sửa chữa nó trong các mã sau đó bằng cách sử dụng lệnh in. Chúng tôi sẽ khởi tạo nó tới 1 kể từ khi thừa của số không và 1 là cả 1, và nếu chúng ta khởi tạo nó không, sau đó chúng tôi luôn luôn muốn kết thúc với số không như là kết quả của chúng tôi. Bạn có thể đặt bất kỳ cách nào biến này, đó là siêu tiện dụng. Bây giờ, chúng ta hãy tiếp tục chương trình của chúng tôi. Hãy chắc chắn rằng tất cả mọi thứ là nơi mà nó là nghĩa vụ phải được. Số lần nên được 4, tôi nên là 1, và thừa nên được 1 quá. Chúng ta có thể phím tắt quá trình này và in tất cả các biến địa phương của chúng tôi với người dân địa phương thông tin hữu ích siêu lệnh, in ra tất cả các biến trong phạm vi địa phương của chúng tôi. Dù sao, nó trông giống như tất cả mọi thứ tốt để đi. Chúng ta hãy làm khác đi xung quanh vòng lặp chỉ để chắc chắn. Được rồi, tất cả mọi thứ có vẻ rất tốt. Bây giờ chúng ta có thể sử dụng lệnh tiếp tục đi đến cùng. Sweet! 4 thừa in ra 24 như mong đợi. Bây giờ chúng ta có thể sửa lỗi này trong mã của chúng tôi. Thay vì bỏ ra của GDB, chúng tôi sẽ sử dụng một thiết bị đầu cuối tab để làm điều này. Quay trở lại tab GDB của chúng tôi, bây giờ chúng ta cần phải biên dịch thực thi của chúng tôi. Một trong những điều tốt nhất về GDB là bạn không cần phải rời khỏi GDB để chạy làm. Vì vậy mà chúng ta không tiếp tục nhấn breakpoint cũ, chúng ta hãy vô hiệu hóa chúng với các, bạn đoán nó, vô hiệu hóa lệnh. Điều này sẽ vô hiệu hóa tất cả các breakpoints của chúng tôi. Bây giờ, chúng ta có thể khởi động lại chương trình với r và chắc chắn rằng tất cả mọi thứ sao. Hình như mọi thứ đều tốt để đi. Thừa của 4 bản in ra 24, giống như chúng ta nghĩ. GDB là một trong những công cụ hữu ích nhất bạn đã có trong hộp công cụ của bạn. Có những điều hơn một tấn bạn có thể làm với GDB, nhiều hơn bạn có thể làm với các bản in đơn giản. Tiếp theo thời gian chương trình của bạn không phải là làm những gì bạn muốn, thử chạy GDB để tìm ra những gì đang xảy ra bên trong. Với một chút chút thực hành, bạn sẽ có thể đi sâu ngay trên lỗi của bạn trong thời gian không. Tên là Nate hardison. Đây là CS50.