Gỡ lỗi – Wikipedia

Gỡ lỗi là quá trình tìm và giải quyết các lỗi hoặc sự cố trong chương trình máy tính ngăn chặn hoạt động chính xác của phần mềm máy tính hoặc hệ thống.

Chiến thuật gỡ lỗi có thể bao gồm gỡ lỗi tương tác, phân tích luồng điều khiển, kiểm tra đơn vị, kiểm tra tích hợp, phân tích tệp nhật ký, giám sát ở cấp ứng dụng hoặc hệ thống, kết xuất bộ nhớ và định hình.

Nguồn gốc của thuật ngữ [ chỉnh sửa ]

Một mục nhật ký máy tính từ Mark II, với một con bướm được gõ vào trang

Thuật ngữ "lỗi" và "gỡ lỗi" Được cho là phổ biến bởi Đô đốc Grace Hopper vào những năm 1940. [1] Khi cô đang làm việc trên máy tính Mark II tại Đại học Harvard, các cộng sự của cô đã phát hiện ra một con sâu bướm bị mắc kẹt trong rơle và do đó cản trở hoạt động, khi đó cô nhận xét rằng chúng đang "gỡ lỗi" hệ thống. Tuy nhiên, thuật ngữ "lỗi", theo nghĩa "lỗi kỹ thuật", xuất hiện ít nhất là từ năm 1878 và Thomas Edison (xem lỗi phần mềm để thảo luận đầy đủ). Tương tự, thuật ngữ "gỡ lỗi" dường như đã được sử dụng như một thuật ngữ trong ngành hàng không trước khi bước vào thế giới máy tính. Thật vậy, trong một cuộc phỏng vấn, Grace Hopper đã nhận xét rằng cô ấy không đặt ra thuật ngữ [ cần trích dẫn ] . Con sâu phù hợp với thuật ngữ đã có, vì vậy nó đã được lưu. Một lá thư của J. Robert Oppenheimer (giám đốc dự án bom nguyên tử WWII "Manhattan" tại Los Alamos, NM) đã sử dụng thuật ngữ này trong một lá thư gửi cho Tiến sĩ Ernest Lawrence tại UC Berkeley, ngày 27 tháng 10 năm 1944, [2] về tuyển dụng thêm nhân viên kỹ thuật.

Mục từ điển tiếng Anh Oxford cho "gỡ lỗi" trích dẫn thuật ngữ "gỡ lỗi" được sử dụng để tham khảo thử nghiệm động cơ máy bay trong một bài viết năm 1945 trên Tạp chí của Hiệp hội Hàng không Hoàng gia. Một bài báo trong "Không quân" (tháng 6 năm 1945 trang 50) cũng đề cập đến việc gỡ lỗi, lần này là máy ảnh máy bay. Lỗi của Hopper được tìm thấy vào ngày 9 tháng 9 năm 1947. Thuật ngữ này không được các lập trình viên máy tính chấp nhận cho đến đầu những năm 1950. Bài báo chuyên đề của Gill [3] năm 1951 là cuộc thảo luận chuyên sâu sớm nhất về các lỗi lập trình, nhưng nó không sử dụng thuật ngữ "lỗi" hay "gỡ lỗi". Trong thư viện kỹ thuật số của ACM, thuật ngữ "gỡ lỗi" lần đầu tiên được sử dụng trong ba bài báo từ Cuộc họp quốc gia ACM năm 1952. [4][5][6] Hai trong số ba sử dụng thuật ngữ này trong dấu ngoặc kép. Đến năm 1963, "gỡ lỗi" là một thuật ngữ đủ phổ biến để được đề cập khi vượt qua mà không cần giải thích ở trang 1 của tài liệu hướng dẫn CTSS. [7]

Bài viết của Kidwell Theo dõi lỗi máy tính khó nắm bắt [8] thảo luận về từ nguyên của "lỗi" và "gỡ lỗi" chi tiết hơn.

Khi phần mềm và hệ thống điện tử nói chung trở nên phức tạp hơn, các kỹ thuật gỡ lỗi phổ biến khác nhau đã mở rộng với nhiều phương pháp hơn để phát hiện sự bất thường, đánh giá tác động và lên lịch vá lỗi phần mềm hoặc cập nhật đầy đủ cho hệ thống. Các từ "dị thường" và "khác biệt" có thể được sử dụng, như là các thuật ngữ trung lập hơn, để tránh các từ "lỗi" và "lỗi" hoặc "lỗi" trong đó có thể có một hàm ý rằng tất cả các lỗi được gọi là [Phảisửalỗi hoặc (bằng mọi giá). Thay vào đó, một đánh giá tác động có thể được thực hiện để xác định xem các thay đổi để loại bỏ sự bất thường (hoặc ) có hiệu quả về mặt chi phí cho hệ thống hay không, hoặc có lẽ một bản phát hành mới theo lịch trình có thể khiến thay đổi không cần thiết Không phải tất cả các vấn đề là quan trọng trong cuộc sống hoặc quan trọng trong một hệ thống. Ngoài ra, điều quan trọng là phải tránh tình trạng thay đổi có thể gây khó chịu cho người dùng, về lâu dài, hơn là sống với (các) vấn đề đã biết (trong đó "phương pháp chữa trị sẽ tồi tệ hơn căn bệnh"). Dựa trên các quyết định về khả năng chấp nhận một số dị thường có thể tránh được văn hóa của mệnh lệnh "không khuyết tật", trong đó mọi người có thể bị từ chối từ chối sự tồn tại của các vấn đề để kết quả sẽ xuất hiện dưới dạng 0 khiếm khuyết . Xem xét các vấn đề về tài sản thế chấp, chẳng hạn như đánh giá tác động chi phí so với lợi ích, sau đó các kỹ thuật sửa lỗi rộng hơn sẽ mở rộng để xác định tần suất của sự bất thường (tần suất xảy ra "lỗi" tương tự) để giúp đánh giá tác động của chúng đối với toàn bộ hệ thống.

Việc gỡ lỗi trên bảng điều khiển trò chơi video thường được thực hiện với phần cứng đặc biệt như bộ gỡ lỗi Xbox này dành cho nhà phát triển.

Phạm vi gỡ lỗi phức tạp từ sửa lỗi đơn giản đến thực hiện các nhiệm vụ dài, mệt mỏi của việc thu thập, phân tích và lên lịch cập nhật dữ liệu . Kỹ năng sửa lỗi của lập trình viên có thể là một yếu tố chính trong khả năng gỡ lỗi của một vấn đề, nhưng độ khó của việc gỡ lỗi phần mềm thay đổi rất lớn với sự phức tạp của hệ thống, và ở một mức độ nào đó, tùy thuộc vào ngôn ngữ lập trình được sử dụng và các công cụ có sẵn, chẳng hạn như trình gỡ lỗi . Trình gỡ lỗi là các công cụ phần mềm cho phép lập trình viên giám sát việc thực hiện chương trình, dừng chương trình, khởi động lại, đặt điểm dừng và thay đổi giá trị trong bộ nhớ. Thuật ngữ trình gỡ lỗi cũng có thể đề cập đến người đang thực hiện việc gỡ lỗi.

Nói chung, các ngôn ngữ lập trình cấp cao, chẳng hạn như Java, giúp gỡ lỗi dễ dàng hơn, bởi vì chúng có các tính năng như xử lý ngoại lệ và kiểm tra loại giúp phát hiện ra các nguồn hành vi thất thường thực sự. Trong các ngôn ngữ lập trình như C hoặc lắp ráp, lỗi có thể gây ra các vấn đề thầm lặng như hỏng bộ nhớ và thường rất khó để biết vấn đề ban đầu xảy ra ở đâu. Trong những trường hợp đó, các công cụ gỡ lỗi bộ nhớ có thể cần thiết.

Trong một số trường hợp nhất định, các công cụ phần mềm có mục đích chung là ngôn ngữ cụ thể về bản chất có thể rất hữu ích. Chúng có dạng công cụ phân tích mã tĩnh . Các công cụ này tìm kiếm một tập hợp rất cụ thể các vấn đề đã biết, một số phổ biến và hiếm gặp, trong mã nguồn. tập trung nhiều hơn vào ngữ nghĩa (ví dụ: luồng dữ liệu) thay vì cú pháp, như trình biên dịch và trình thông dịch thực hiện.

Một số công cụ tuyên bố có thể phát hiện hơn 300 vấn đề khác nhau. Cả hai công cụ thương mại và miễn phí đều tồn tại cho các ngôn ngữ khác nhau. Các công cụ này có thể cực kỳ hữu ích khi kiểm tra các cây nguồn rất lớn, nơi không thực tế để thực hiện các bước mã. Một ví dụ điển hình của một vấn đề được phát hiện sẽ là một sự thay đổi quy định xảy ra trước khi biến được gán một giá trị. Một ví dụ khác, một số công cụ như vậy thực hiện kiểm tra loại mạnh khi ngôn ngữ không yêu cầu. Vì vậy, họ tốt hơn trong việc định vị các lỗi có khả năng trong mã là đúng về mặt cú pháp. Nhưng các công cụ này có tiếng là dương tính giả, trong đó mã chính xác được gắn cờ là đáng ngờ. Chương trình Unix lint cũ là một ví dụ ban đầu.

Để gỡ lỗi phần cứng điện tử (ví dụ: phần cứng máy tính) cũng như phần mềm cấp thấp (ví dụ: BIOS, trình điều khiển thiết bị) và phần sụn, các công cụ như máy hiện sóng, máy phân tích logic hoặc trình giả lập trong mạch (ICE) thường được sử dụng, Một mình hoặc kết hợp. ICE có thể thực hiện nhiều tác vụ gỡ lỗi phần mềm điển hình trên phần mềm và chương trình cơ sở cấp thấp.

Quá trình gỡ lỗi [ chỉnh sửa ]

Thông thường bước đầu tiên trong quá trình gỡ lỗi là cố gắng tái tạo vấn đề. Đây có thể là một nhiệm vụ không hề nhỏ, ví dụ như với các quy trình song song hoặc một số lỗi phần mềm bất thường. Ngoài ra, môi trường người dùng cụ thể và lịch sử sử dụng có thể gây khó khăn cho việc tái tạo vấn đề.

Sau khi lỗi được sao chép, đầu vào của chương trình có thể cần được đơn giản hóa để dễ gỡ lỗi hơn. Ví dụ, một lỗi trong trình biên dịch có thể làm cho nó bị sập khi phân tích một số tệp nguồn lớn. Tuy nhiên, sau khi đơn giản hóa trường hợp thử nghiệm, chỉ một vài dòng từ tệp nguồn gốc có thể đủ để tái tạo cùng một sự cố. Đơn giản hóa như vậy có thể được thực hiện bằng tay, bằng cách sử dụng phương pháp phân chia và chinh phục. Lập trình viên sẽ cố gắng loại bỏ một số phần của trường hợp thử nghiệm ban đầu và kiểm tra xem sự cố có còn tồn tại không. Khi gỡ lỗi sự cố trong GUI, lập trình viên có thể cố gắng bỏ qua một số tương tác của người dùng khỏi mô tả sự cố ban đầu và kiểm tra xem các hành động còn lại có đủ để lỗi xuất hiện không.

Sau khi trường hợp kiểm thử được đơn giản hóa đủ, lập trình viên có thể sử dụng công cụ gỡ lỗi để kiểm tra trạng thái chương trình (giá trị của các biến, cộng với ngăn xếp cuộc gọi) và theo dõi nguồn gốc của (các) vấn đề. Ngoài ra, truy tìm có thể được sử dụng. Trong các trường hợp đơn giản, theo dõi chỉ là một vài câu lệnh in, đưa ra các giá trị của các biến tại một số điểm thực hiện chương trình nhất định. [ cần trích dẫn ]

Kỹ thuật [ chỉnh sửa ]

  • Gỡ lỗi tương tác
  • Gỡ lỗi in (hoặc theo dõi) là hành động xem (theo dõi hoặc ghi lại) các câu lệnh theo dõi, hoặc in các câu lệnh, cho biết dòng chảy của quá trình thực thi. Điều này đôi khi được gọi là printf debugging do sử dụng chức năng printf trong C. Loại gỡ lỗi này được bật bởi lệnh TRON trong các phiên bản gốc của ngôn ngữ lập trình BASIC hướng đến người mới. TRON là viết tắt của "Trace On." TRON khiến số dòng của mỗi dòng lệnh BASIC được in khi chương trình chạy.
  • Gỡ lỗi từ xa là quá trình gỡ lỗi chương trình chạy trên hệ thống khác với trình gỡ lỗi. Để bắt đầu gỡ lỗi từ xa, trình gỡ lỗi kết nối với hệ thống từ xa qua liên kết truyền thông, chẳng hạn như mạng cục bộ. Trình gỡ lỗi sau đó có thể kiểm soát việc thực thi chương trình trên hệ thống từ xa và truy xuất thông tin về trạng thái của nó.
  • Gỡ lỗi sau khi chết đang gỡ lỗi chương trình sau khi nó bị hỏng. Các kỹ thuật liên quan thường bao gồm các kỹ thuật theo dõi khác nhau (ví dụ: [9]) và / hoặc phân tích kết xuất bộ nhớ (hoặc kết xuất lõi) của quy trình bị hỏng. Kết xuất của quy trình có thể được hệ thống lấy tự động (ví dụ: khi quá trình kết thúc do ngoại lệ chưa được xử lý) hoặc bởi một lệnh được lập trình viên chèn hoặc bởi người dùng tương tác.
  • "Hàng rào sói" thuật toán: Edward Gauss đã mô tả thuật toán đơn giản nhưng rất hữu ích và hiện đang nổi tiếng này trong một bài viết năm 1982 về truyền thông của ACM như sau: "Có một con sói ở Alaska, làm thế nào bạn tìm thấy nó? Trước tiên hãy xây dựng một hàng rào ở giữa trạng thái, đợi con sói hú lên, xác định nó ở phía nào của hàng rào. Chỉ lặp lại quá trình ở phía đó, cho đến khi bạn có thể nhìn thấy con sói. "[10] Điều này được thực hiện, ví dụ trong hệ thống kiểm soát phiên bản Git dưới dạng lệnh git bisect sử dụng thuật toán trên để xác định cam kết nào đã đưa ra một lỗi cụ thể.
  • Delta Debugging – một kỹ thuật tự động đơn giản hóa trường hợp kiểm thử. [19659043]: p.123
  • Saff Squeeze – một kỹ thuật cách ly thất bại trong thử nghiệm bằng cách sử dụng nội bộ các phần của thử nghiệm thất bại. [12]

Gỡ lỗi cho các hệ thống nhúng. 19659004] [ chỉnh sửa ]

Trái ngược với môi trường thiết kế phần mềm máy tính đa năng, một đặc điểm chính của môi trường nhúng là số lượng nền tảng khác nhau có sẵn cho các nhà phát triển (kiến trúc CPU, nhà cung cấp, hệ điều hành và các biến thể của chúng). Theo định nghĩa, các hệ thống nhúng không phải là thiết kế cho mục đích chung: chúng thường được phát triển cho một nhiệm vụ duy nhất (hoặc phạm vi nhiệm vụ nhỏ) và nền tảng được chọn riêng để tối ưu hóa ứng dụng đó. Thực tế này không chỉ gây khó khăn cho các nhà phát triển hệ thống nhúng, mà còn khiến việc gỡ lỗi và kiểm tra các hệ thống này trở nên khó khăn hơn, vì các công cụ gỡ lỗi khác nhau là cần thiết cho các nền tảng khác nhau.

Mặc dù thách thức về tính không đồng nhất được đề cập ở trên, một số trình gỡ lỗi đã được phát triển về mặt thương mại cũng như các nguyên mẫu nghiên cứu. Ví dụ về các giải pháp thương mại đến từ Phần mềm Green Hills [13] và MPLAB-ICD của Microchip (dành cho trình gỡ lỗi trong mạch). Hai ví dụ về các công cụ nguyên mẫu nghiên cứu là Aveksha [14] và Flocklab. [15] Tất cả đều tận dụng một chức năng có sẵn trên các bộ xử lý nhúng chi phí thấp, Mô-đun gỡ lỗi trên chip (OCDM), có tín hiệu được phơi bày qua giao diện JTAG tiêu chuẩn. Chúng được điểm chuẩn dựa trên mức độ thay đổi của ứng dụng là cần thiết và tỷ lệ các sự kiện mà chúng có thể theo kịp.

Ngoài nhiệm vụ điển hình là xác định lỗi trong hệ thống, gỡ lỗi hệ thống nhúng còn tìm cách thu thập thông tin về trạng thái hoạt động của hệ thống mà sau đó có thể được sử dụng để phân tích hệ thống: tìm cách tăng hiệu suất của nó hoặc để tối ưu hóa các đặc điểm quan trọng khác (ví dụ tiêu thụ năng lượng, độ tin cậy, đáp ứng thời gian thực, v.v.).

Chống gỡ lỗi [ chỉnh sửa ]

Chống gỡ lỗi là "việc thực hiện một hoặc nhiều kỹ thuật trong mã máy tính gây cản trở các nỗ lực trong kỹ thuật đảo ngược hoặc gỡ lỗi quy trình đích". [19659056] Nó được sử dụng tích cực bởi các nhà xuất bản được công nhận trong các lược đồ chống sao chép, nhưng cũng được sử dụng bởi phần mềm độc hại để làm phức tạp việc phát hiện và loại bỏ nó. [17] Các kỹ thuật được sử dụng trong chống gỡ lỗi bao gồm:

  • Dựa trên API: kiểm tra sự tồn tại của trình gỡ lỗi bằng cách sử dụng thông tin hệ thống
  • Dựa trên ngoại lệ: kiểm tra xem các ngoại lệ có bị can thiệp vào
  • Khối xử lý và chuỗi xử lý hay không: kiểm tra xem liệu quy trình và khối luồng có bị thao túng không [19659059] Mã đã sửa đổi: kiểm tra các sửa đổi mã được thực hiện bởi các điểm dừng xử lý phần mềm gỡ lỗi
  • Dựa trên phần cứng và đăng ký: kiểm tra các điểm dừng phần cứng và các thanh ghi CPU
  • Thời gian và độ trễ: kiểm tra thời gian thực hiện các lệnh [19659059] Phát hiện và xử phạt trình gỡ lỗi [17]

Một ví dụ ban đầu về chống gỡ lỗi tồn tại trong các phiên bản đầu của Microsoft Word, nếu phát hiện ra trình gỡ lỗi, đã tạo ra một thông báo có nội dung: "Cây ác mang quả đắng. . ", Sau đó, nó đã khiến ổ đĩa mềm phát ra tiếng động đáng báo động với mục đích khiến người dùng sợ hãi khi cố gắng sử dụng lại. [18][19]

Xem thêm [ chỉnh sửa ]

[ chỉnh sửa ]

  1. ^ Grace Hopper từ FOLDOC
  2. ^ http: //bancroft.ber siêu.edu / Exrictits / phép thuật / hình ảnh 19659074] ^ S. Gill, Chẩn đoán sai lầm trong các chương trình trên EDSAC, Kỷ yếu của Hiệp hội Hoàng gia Luân Đôn. Series A, Toán học và Vật lý, Tập. 206, số 1087 (ngày 22 tháng 5 năm 1951), trang 538-554
  3. ^ Robert V. D. Campbell, Sự phát triển của tính toán tự động, Kỷ yếu của cuộc họp quốc gia ACM năm 1952 (Pittsburgh), trang 29-32, 1952.
  4. ^ Alex Orden, Giải pháp về hệ thống bất bình đẳng tuyến tính trên máy tính kỹ thuật số, Kỷ yếu của cuộc họp quốc gia ACM năm 1952 (Pittsburgh), tr. 91-95, 1952.
  5. ^ Howard B. Demuth, John B. Jackson, Edmund Klein, N. Metropolis, Walter Orvedahl, James H. Richardson, MANIAC, Kỷ yếu của cuộc họp quốc gia ACM năm 1952 (Toronto), tr. 13-16
  6. ^ Hệ thống chia sẻ thời gian tương thích, M.I.T. Báo chí, 1963
  7. ^ Peggy Aldrich Kidwell, theo dõi lỗi máy tính khó nắm bắt, Biên niên sử của lịch sử điện toán, 1998.
  8. ^ "Gỡ lỗi sau khi chuyển đổi". 19659071] E. J. Gauss (1982). "" Pracniques: Thuật toán "Hàng rào sói" để gỡ lỗi ",".
  9. ^ Andreas Zeller: Tại sao các chương trình thất bại: Hướng dẫn về gỡ lỗi hệ thống Morgan Kaufmann , 2005. ISBN 1-55860-866-4
  10. ^ "Kent Beck, Hit 'em High, Hit' em Low: Regression tests and the Saff Squeeze".
  11. ^ "Trình gỡ lỗi phần cứng SuperTrace thăm dò". www.ghs.com . Truy cập 2017-11-25 .
  12. ^ Tancreti, Matthew; Hossain, Mohammad Sajjad; Bagchi, Saurabh; Raghunathan, Vijay (2011). "Aveksha: Cách tiếp cận phần mềm-phần cứng cho truy tìm và cấu hình không xâm phạm của các hệ thống nhúng không dây". Kỷ yếu của Hội nghị ACM lần thứ 9 về Hệ thống cảm biến nối mạng nhúng . SenSys '11. New York, NY, Hoa Kỳ: ACM: 288 xăng495. doi: 10.1145 / 2070942.2070972. ISBN Bolog50307185.
  13. ^ Lim, Roman; Ferrari, Federico; Zimmerling, Marco; Walser, Christoph; Sommer, Philipp; Beutel, tháng 1 (2013). "FlockLab: Một thử nghiệm cho truy tìm phân tán, đồng bộ hóa và cấu hình của các hệ thống nhúng không dây". Thủ tục tố tụng của Hội nghị quốc tế lần thứ 12 về xử lý thông tin trong các mạng cảm biến . IPSN '13. New York, NY, Hoa Kỳ: ACM: 153 trừ166. doi: 10.1145 / 2461381.2461402. ISBN Bolog50319591.
  14. ^ Shields, Tyler (2008-12-02). "Dòng chống gỡ lỗi – Phần I". Veracode . Truy xuất 2009/03/17 .
  15. ^ a b "Bảo vệ phần mềm thông qua chống gỡ lỗi Michael N Gagnon, Stephen Taylor , Anup Ghosh " (PDF) .
  16. ^ Ross J. Anderson. Kỹ thuật bảo mật . tr. 684. ISBN 0-471-38922-6.
  17. ^ "Microsoft Word cho DOS 1.15".

Đọc thêm [ chỉnh sửa ]

  • David J. Agans: Gỡ lỗi: Chín quy tắc không thể thiếu để tìm kiếm ngay cả những vấn đề phần mềm và phần cứng khó nắm bắt nhất AMACOM, 2002. ISBN 0-8144-7168-4 [19659059] Bill Blunden: Exorcism phần mềm: Cẩm nang để gỡ lỗi và tối ưu hóa mã di sản APress, 2003. ISBN 1-59059-234-4
  • Ann R. Ford, Toby J. Teorey : Gỡ lỗi thực tế trong C ++ Prentice Hall, 2002. ISBN 0-13-065394-2
  • Thorsten Grötker, Ulrich Holtmann, Holger Kting, Markus Wloka, Gỡ lỗi, Ấn bản thứ hai Createspace, 2012. ISBN 1-4701-8552-0
  • Robert C. Metzger: Gỡ lỗi bằng cách suy nghĩ: Cách tiếp cận đa ngành Báo chí kỹ thuật số, 2003. ISBN 1-55558-307-5
  • Glenford J Myers: * Nghệ thuật kiểm thử phần mềm John Wiley & Sons inc, 2004. ISBN 0-471-04328-1
  • John Robbins: Ứng dụng gỡ lỗi Microsoft Press, 2000. ISBN 0-7356-0886-5
  • Matthew A. Telles, Yuan Hsieh: Khoa học về gỡ lỗi The Tập đoàn Coriolis, 2001. ISBN 1-57610-917-8
  • Dmitry Vostokov: Tuyển tập phân tích kết xuất bộ nhớ, Tập 1 OpenTask, 2008 ISBN 980-0-9558328- 0-2
  • Andreas Zeller: Tại sao các chương trình thất bại, Ấn bản thứ hai: Hướng dẫn về gỡ lỗi hệ thống Morgan Kaufmann, 2009. ISBN 0-1237-4515-2

Liên kết ngoài [19659004] [ chỉnh sửa ]