Mã gỡ lỗi có nên được đặt đúng chỗ, luôn luôn hoặc chỉ được thêm khi gỡ lỗi và gỡ bỏ khi tìm thấy lỗi không?


35

Tôi, đối với một, chỉ thêm mã gỡ lỗi (chẳng hạn như báo cáo in) khi tôi đang cố gắng xác định vị trí lỗi. Và một khi tôi đã tìm thấy nó, tôi xóa mã gỡ lỗi (và thêm một trường hợp kiểm tra để kiểm tra cụ thể lỗi đó). Tôi cảm thấy rằng nó làm lộn xộn mã thực và do đó không có chỗ nào trừ khi tôi gỡ lỗi.

Bạn làm nó như thế nào? Bạn có để lại mã gỡ lỗi tại chỗ không, hoặc xóa nó khi lỗi thời (điều này có thể khó đánh giá khi đó)?

Câu trả lời:


30

Báo cáo in gỡ lỗi nên được đưa ra; tuy nhiên, nếu bạn cần thêm chúng để gỡ lỗi một vấn đề sản xuất thì có thể đáng cân nhắc nếu bạn có đủ thông tin được đưa vào khung đăng nhập của mình. Thông tin về các tham số, điều kiện lỗi và vv có thể hữu ích sau này khi lỗi tiếp theo xuất hiện. Sử dụng một khung ghi nhật ký tốt có thể được gỡ lỗi hoặc theo dõi các thông điệp nhật ký được bật một cách linh hoạt có thể rất hữu ích trong tự nhiên.


5
+1 Chủ yếu để đề cập đến việc có một khung gỡ lỗi hợp lý. Nếu điều này xảy ra ban đầu và có nhiều mức gỡ lỗi khác nhau, thì mã sản xuất có thể hy vọng chạy mà không cần gọi các thói quen gỡ lỗi đắt tiền và mã phát triển có thể chạy với bất kỳ mức độ xem xét nào được yêu cầu, hy vọng đăng nhập theo bất kỳ cách nào mong muốn.
Orble

1
Đồng ý với Orble. Và hơn nữa, đối với mã gỡ lỗi không chỉ hiển thị thông tin có ảnh hưởng đến hiệu suất hoặc lý do khác không phù hợp để sản xuất. (ví dụ: Xác nhận kết quả của chức năng, ví dụ: kiểm tra kết quả của một loại), bạn có thể xem xét hai chế độ của mục tiêu xây dựng. chế độ gỡ lỗi và chế độ phát hành.
Zekta Chan

16

Mã được thêm vào để gỡ lỗi nên được gỡ bỏ khỏi phần mềm sản xuất.

Cho dù điều này là loại bỏ hoàn toàn hoặc được đưa vào các phần biên dịch có điều kiện (như trong C / C ++ / C #) là tùy thuộc vào bạn và tiêu chuẩn mã hóa của bạn.

Có một số lý do cho việc này:

  1. Có thể có ý nghĩa bảo mật nếu mã này được thực thi hoặc ai đó có thể truy cập vào đầu ra của nó.
  2. Nó có thể làm chậm ứng dụng.
  3. Nó có thể gây nhầm lẫn cho các nhà phát triển khác đang xem mã (hoặc thực sự là chính bạn) sau 6 tháng.

+1 để biên dịch có điều kiện, nhưng các khối nhận xét sẽ hoạt động với các ngôn ngữ không hỗ trợ chúng. Bạn không bao giờ nên để nó được biên dịch thành một bản phát hành prod, nhưng đôi khi nó không hiệu quả quá mức để tiếp tục xóa nó hoàn toàn mỗi khi bạn muốn bỏ bản dựng phát hành.
Hóa đơn

1
Tôi đã làm việc trong các môi trường nơi mã C / C ++ luôn được biên dịch với các tùy chọn gỡ lỗi trong trường hợp mã sản xuất cần được gỡ lỗi hoặc được kiểm tra. Đôi khi điều này luôn sẵn sàng để gỡ lỗi bắt buộc yêu cầu các câu lệnh gỡ lỗi được để lại để chúng có thể được bật bằng một cờ mà không cần biên dịch lại mã. Java luôn cho phép gỡ lỗi nếu các tùy chọn JVM của bạn được đặt cho nó để công việc chuẩn bị tương đối ít hơn được yêu cầu để gỡ lỗi mọi thứ sau này.
Michael Storesin

16

Cả ChrisFAlaric đều có điểm hợp lệ; +1 cho họ. Tôi có thể xác định ít nhất 5 loại mã gỡ lỗi khác nhau mà tôi sử dụng.

  1. Sử dụng nhật ký để kết xuất trạng thái hệ thống tại một thời điểm cụ thể.

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. Sử dụng nhật ký cho các điểm kiểm tra thực hiện.

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. Mã thực sự buộc một điều kiện nhất định là đúng, nhưng phá vỡ hành vi bình thường. Thí dụ:

    • Giả sử bạn có một số nhật ký liên quan đến lỗi, nhưng bạn không thể tái tạo vấn đề. Bạn có thể thử viết mã buộc các biến nhất định phải có các giá trị nhất định khớp với thông tin trong nhật ký.
  4. Ghi nhật ký xác minh - Tôi sẽ phân loại đây là ghi nhật ký chi tiết có thể được sử dụng để xác thực tính chính xác của phần mềm không được đưa vào sản xuất, ví dụ như xác thực các bước riêng lẻ của thuật toán.

  5. Hoạt động đăng nhập - tham khảo bài viết của Alaric . Đó là khá nhiều những gì tôi có nghĩa là "hoạt động đăng nhập".

1, 2 và 3 nên được đưa ra hoàn toàn. Một cái gì đó giống như 4 Tôi có thể sẽ biên dịch có điều kiện ra khỏi mã. Trong 5, Alaric đã có một điểm tuyệt vời về khả năng tự động tắt các bản ghi. Điều đó có thể giải quyết quan điểm của ChrisF trong viên đạn thứ hai của anh ta trong hầu hết các trường hợp.


1
Đây là một bản tóm tắt tốt. Tuy nhiên, nó sẽ là tốt hơn nếu bạn có thể định dạng nó đúng cách bằng cách thay thế 1)... với 1.... (sao cho Markdown định dạng chọn nó lên như một danh sách) và thụt mã ví dụ 8 chỗ (một lần nữa, để Markdown nhặt nó lên làm ví dụ mã trong một danh sách).
Konrad Rudolph

@Konrad Rudolph: Xong rồi.
gablin

3

Nó phụ thuộc vào những gì mã đang làm. Một số mã được sử dụng để gỡ lỗi có thể được để nguyên như vậy và một số mã cần được loại bỏ.

Mã xác minh độ chính xác của các tham số trong một phương thức không phải lúc nào cũng hữu ích một khi mã hoạt động đúng, nhưng nó thường được giữ để đảm bảo rằng mã đang tiếp tục hoạt động đúng.

Đôi khi bạn viết mã khác nhau để dễ gỡ lỗi mã hơn, ví dụ tính toán một giá trị và đặt nó vào một biến cục bộ, sau đó sử dụng biến trong dòng tiếp theo, giúp dễ dàng kiểm tra kết quả tính toán khi bước đơn thông qua mã. Bạn có thể viết lại mã để sử dụng trực tiếp giá trị được tính toán, nhưng chi phí sử dụng biến cục bộ quá nhỏ (nếu có) mà có rất ít lý do để viết lại mã. Ngoài ra, có một điểm khiến mã không thay đổi một khi bạn đã kiểm tra nó, luôn có một rủi ro nhỏ là bạn đưa ra một lỗi khi thay đổi nó.

Mã mà bạn thêm chỉ để theo dõi một lỗi cụ thể thường có thể bị xóa sau khi bạn tìm thấy lỗi.


2

Ngày xưa tôi thường sử dụng rất nhiều mã gỡ lỗi. Tôi gần như hoàn toàn nhắm mục tiêu vào Windows, vì vậy có rất nhiều hàm đầu ra chuỗi gỡ lỗi này mà tôi không nhớ cách đánh vần nữa, vì vậy tôi có thể ghi lại dấu vết bằng một chương trình cụ thể.

Một số mã gỡ lỗi được giữ nguyên vị trí, những thứ cụ thể được dự định để cung cấp cho các cuộc gọi lồng nhau. Tuy nhiên, mặc dù điều chuỗi gỡ lỗi hầu như không thể nhìn thấy trên một hệ thống sản xuất, nhưng tất cả vẫn được thực hiện trong quá trình biên dịch có điều kiện.

Mặc dù vậy, thực tế là tất cả các mã gỡ lỗi đó là rất nhiều nỗ lực cho một thứ được xử lý lý tưởng theo một cách khác - tất nhiên, sử dụng một trình gỡ lỗi. Vào thời điểm đó, tôi không ấn tượng lắm với trình gỡ lỗi Borland C ++. Các công cụ có ở đó, nhưng chúng thường đưa ra kết quả sai lệch và sử dụng trình gỡ lỗi không phải IDE (thường là cần thiết) có nghĩa là ghi nhớ các phím tắt, có nghĩa là mất tập trung trong công việc.

Trải nghiệm gỡ lỗi duy nhất tôi thấy tệ hơn là GDB dòng lệnh.

Tất nhiên, trở thành một chuyên gia với các công cụ bạn sử dụng là điều quan trọng - nhưng việc gỡ lỗi thực sự không nên là việc bạn làm mỗi ngày. Nếu bạn sử dụng trình gỡ lỗi thường xuyên, bạn sẽ ổn khi học hàng tá lệnh và / hoặc phím tắt, điều đó có vẻ hơi cờ đỏ đối với tôi.

Tuy nhiên, khi tôi làm việc trong Visual Studio 7, rõ ràng việc gỡ lỗi có thể rất thiết thực và hiệu quả. Nếu bạn có thể thực hiện việc sửa lỗi của mình trong Visual Studio (bao gồm các phiên bản thể hiện), việc gỡ lỗi rất dễ dàng. Không có nghi ngờ gì nếu bạn có thể tìm thấy giao diện người dùng GUI / IDE phù hợp, GDB cũng dễ dàng và hiệu quả, mặc dù tôi chưa thực hiện tìm kiếm đó.

Ngoài ra còn có điều gì đó để nói về thử nghiệm đơn vị, với phân tích bảo hiểm bằng cách sử dụng gcov. Bạn càng tin tưởng vào hành vi của các thư viện của mình, thì việc gỡ lỗi của bạn càng ít sâu sắc - và bạn càng ít cần trình gỡ lỗi ở nơi đầu tiên. Và viết bài kiểm tra đơn vị là khá hợp lý một cái gì đó bạn nên làm hầu hết các ngày.

Công cụ quan trọng bất ngờ = cmake, một công cụ xây dựng cho phép tôi dễ dàng chuyển đổi giữa xây dựng cho GCC và cho VC ++, trong số những thứ khác. Vì vậy, tôi có thể thực hiện kiểm tra đơn vị của mình và bảo hiểm dựa trên gcov bằng GCC, nhưng dễ dàng chuyển sang VC ++ để sử dụng trình gỡ lỗi.


Trình gỡ lỗi có thể khá vô dụng nếu không nguy hiểm trong các ứng dụng đa luồng, nhưng tôi thích bình luận cờ đỏ của bạn.
Pemdas

@Pemdas - Tôi chưa gặp vấn đề nghiêm trọng nào, mặc dù đa luồng rõ ràng là không thân thiện với trình gỡ lỗi. Mặc dù vậy, tôi nghĩ rằng các công cụ phù hợp có khả năng là một giải pháp tốt hơn so với mã gỡ lỗi về nguyên tắc. Một công cụ phân tích tĩnh có thể phát hiện ra các điều kiện chủng tộc, các bế tắc, các điều kiện khi hai luồng có thể chiến đấu trên cùng một bộ nhớ / tài nguyên cùng một lúc và cứ thế sẽ rất tuyệt. Tôi không biết những gì có sẵn dọc theo những dòng đó, mặc dù tôi biết rằng có một số công cụ thông minh ngoài kia. klee, ví dụ - tôi không hiểu nó, nhưng mô tả cơ bản nghe rất ấn tượng.
Steve314

"Tôi nghĩ rằng các công cụ phù hợp có khả năng là một giải pháp tốt hơn so với mã gỡ lỗi về nguyên tắc" Đó là một tuyên bố nguy hiểm;). Có các công cụ tạo ra một số phân tích có thể tốt, nhưng tôi lo lắng rằng các nhà phát triển đặc biệt là những người mới sẽ bắt đầu quá phụ thuộc vào các công cụ, giống như ai đó cần sử dụng máy tính để tìm ra 15% của 100 là gì.
Pemdas

Quá phụ thuộc vào các công cụ tôi thậm chí chưa nghiên cứu dường như là không thể. Trên ví dụ máy tính của bạn, có, nhưng tôi vẫn sẽ sử dụng OpenOffice Calc thay vì viết bảng tính đơn giản của riêng tôi. Có thời gian để mã gỡ lỗi (ngay cả với trình gỡ lỗi - ví dụ: trường hợp tạo điều kiện kỳ ​​quái của riêng bạn), nhưng nếu vượt quá một điểm nhất định, các công cụ hiện có sẽ thắng. Và khi trừ đi 15% từ 115, tôi cũng sẽ sử dụng máy tính đó - điều mà nhiều người sẽ đưa ra khi câu trả lời rõ ràng (100) là sai. Trong đa luồng, rõ ràng câu trả lời đúng là tai tiếng vì đôi khi hóa ra là sai.
Steve314

1

Tôi chấp nhận điều đó: Mã gỡ lỗi được sử dụng để tiêu diệt một lỗi trong mã được đề cập mà tôi thường loại bỏ hoàn toàn. Mã gỡ lỗi được sử dụng để tiêu diệt một lỗi phát sinh từ các lực lượng bên ngoài, tôi thường chỉ đơn giản là nhận xét.


-1

Nếu lỗi là từ kiểm tra đơn vị hoặc từ nội bộ, mã gỡ lỗi có thể được loại bỏ hoàn toàn. Nhưng nếu lỗi là từ sản xuất, mã gỡ lỗi tốt hơn nên có trong các thẻ biên dịch. Đặt nó bên trong các thẻ biên dịch sẽ giúp các nhà phát triển khác hiểu rằng mã này chỉ dành cho mục đích gỡ lỗi.


-1

Sử dụng TDD , vì vậy mã kiểm tra của bạn luôn có một nơi thậm chí được duy trì.


Làm thế nào để trả lời câu hỏi này?
gnat

Bởi vì TDD dẫn bạn đến "gỡ lỗi" hoặc kiểm tra mã mà bạn không phải xóa.
dukeofgaming

Tôi không làm theo xin lỗi. Làm như thế nào?
gnat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.