2009-04-08 29 views
5

Cách tiêu chuẩn của bạn để gỡ rối một vấn đề là gì? Điều này có vẻ giống như một câu hỏi khá rộng với một số bạn trả lời 'Nó phụ thuộc vào vấn đề' nhưng tôi nghĩ rằng rất nhiều người trong chúng ta gỡ lỗi theo bản năng và đã không thực sự cố gắng từ ngữ quá trình của chúng tôi. Đó là lý do tại sao chúng ta nói 'nó phụ thuộc'.Phương pháp gỡ lỗi chuẩn

Tôi đã bị buộc phải từ bỏ quá trình của mình gần đây vì một vài nhà phát triển và tôi đang làm việc cùng một vấn đề và chúng tôi đã gỡ lỗi theo những cách hoàn toàn khác nhau. Tôi muốn họ hiểu những gì tôi đang cố gắng làm và ngược lại.

Sau một số phản ánh, tôi nhận ra rằng cách gỡ lỗi của tôi thực sự khá đơn điệu. Trước tiên, tôi sẽ cố gắng để có thể tái tạo một cách đáng tin cậy vấn đề (đặc biệt là trên máy cục bộ của tôi). Sau đó, thông qua một loạt các loại bỏ (và đây là nơi tôi nghĩ rằng đó là vấn đề phụ thuộc) cố gắng xác định vấn đề.

Những người khác đang cố gắng làm điều đó theo một cách hoàn toàn khác.

Vì vậy, hãy tự hỏi điều gì đã làm việc cho các bạn ở ngoài đó? Và những gì bạn sẽ nói quá trình của bạn là để gỡ lỗi nếu bạn phải chính thức hóa nó trong lời nói?

BTW, chúng tôi vẫn chưa phát hiện ra vấn đề của chúng ta =)

+1

Vấn đề của bạn là với mô-đun đồng bộ hóa, bạn cần sử dụng nhiều XML hơn - cũng chuyển đổi sang JSON là hoàn toàn sai. Cuối cùng, tất của bạn nằm phía sau chiếc ghế dài –

+0

Yea, tôi đã tự hỏi họ đã ở đâu =) – Fung

Trả lời

7

Cách tiếp cận của tôi thay đổi dựa trên sự quen thuộc của tôi với hệ thống trong tầm tay. Thông thường tôi làm điều gì đó như:

  1. Tái tạo sự thất bại, nếu có thể.
  2. Kiểm tra trạng thái lỗi để xác định nguyên nhân tức thời của lỗi.
  3. Nếu tôi quen thuộc với hệ thống, tôi có thể đoán trước về nguyên nhân gốc rễ. Nếu không, tôi bắt đầu theo dõi máy móc dữ liệu trở lại thông qua phần mềm trong khi thách thức các giả định cơ bản được thực hiện bởi phần mềm.
  4. Nếu sự cố có vẻ có trình kích hoạt nhất quán, tôi có thể theo cách thủ công về phía trước thông qua mã bằng trình gỡ lỗi trong khi thử thách các giả định ngầm định rằng mã tạo.

Truy tìm nguyên nhân gốc, tất nhiên, nơi mọi thứ có thể bị lông. Đây là nơi có một bãi chứa (hoặc tốt hơn, một quá trình sống, bị hỏng) có thể thực sự vô giá.

Tôi nghĩ rằng điểm mấu chốt trong quá trình gỡ lỗi của tôi là thử thách các quan niệm trước và giả định. Số lần tôi đã tìm thấy lỗi trong thành phần đó mà tôi hoặc một đồng nghiệp sẽ thề đang hoạt động tốt là rất lớn.

Tôi đã được bạn bè và đồng nghiệp trực quan của tôi kể rằng tôi khá là khó hiểu khi họ xem tôi gỡ lỗi hoặc yêu cầu tôi giúp họ tìm ra thứ gì đó. :)

+0

+1 cho các giả thuyết và giả định đầy thử thách. – Fung

3

Khi tôi lên chống lại một lỗi mà tôi không thể nhận được vẻ ra, tôi muốn thực hiện một mô hình của vấn đề. Tạo một bản sao của phần mã sự cố và bắt đầu xóa các tính năng từ mã đó, mỗi lần một. Chạy thử nghiệm đơn vị dựa vào mã sau mỗi lần xóa. Thông qua quá trình này, bạn sẽ loại bỏ các tính năng với các lỗi (và do đó, xác định vị trí các lỗi), hoặc bạn sẽ có cô lập các lỗi xuống một phần cốt lõi của mã có chứa bản chất của vấn đề. Và một khi bạn tìm ra bản chất của vấn đề, nó dễ dàng hơn nhiều để sửa chữa.

1

Tôi cũng là người hâm mộ lớn trong việc sử dụng quy trình xóa. Loại trừ các biến đơn giản hóa rất nhiều nhiệm vụ gỡ lỗi.Nó thường là điều đầu tiên cần phải làm.

Một kỹ thuật thực sự hiệu quả khác là quay lại phiên bản làm việc cuối cùng của bạn nếu có thể và thử lại. Điều này có thể cực kỳ mạnh mẽ vì nó giúp bạn vững chắc hơn để tiến hành kỹ lưỡng hơn. Một biến thể về điều này là để có được mã đến một điểm mà nó đang làm việc, với ít chức năng hơn là không làm việc với nhiều chức năng hơn.

Tất nhiên, điều quan trọng là không chỉ thử mọi thứ. Điều này làm tăng tuyệt vọng của bạn bởi vì nó không bao giờ hoạt động. Tôi muốn thực hiện 50 chạy để thu thập thông tin về lỗi thay vì đi một swing hoang dã và hy vọng nó hoạt động.

2

Tôi thường bắt đầu bằng cách hình thành một giả thuyết dựa trên thông tin tôi có trong tầm tay. Một khi điều này được thực hiện, tôi làm việc để chứng minh nó là chính xác. Nếu nó chứng minh là sai, tôi bắt đầu với một giả thuyết khác.

Hầu hết các vấn đề đồng bộ hóa đa luồng được giải quyết rất dễ dàng với phương pháp này.

Ngoài ra, bạn cần hiểu rõ về trình gỡ lỗi bạn đang sử dụng và các tính năng của trình gỡ lỗi. Tôi làm việc trên các ứng dụng Windows và đã tìm thấy windbg là cực kỳ hữu ích trong việc tìm kiếm lỗi.

+1

Tôi thấy điều này chỉ hoạt động cho các nhà phát triển có kinh nghiệm. Khi người mới cố gắng làm điều đó nó có vẻ giống như bắn ngẫu nhiên và hy vọng sẽ đạt được một. Tôi đoán chủ yếu là vì họ thiếu kinh nghiệm để bắt đầu với giả thuyết đáng tin cậy nhất. Vì vậy, thực sự không khuyên điều này cho thuê mới. – Fung

2

Giảm lỗi về biểu mẫu đơn giản nhất thường dẫn đến hiểu rõ hơn về vấn đề cũng như thêm lợi ích của việc có thể liên quan đến những người khác nếu cần.

Thiết lập kịch bản sinh sản nhanh để cho phép sử dụng hiệu quả thời gian của bạn để kiểm tra bất kỳ giả thuyết nào bạn đã chọn.

Tạo công cụ để nhanh chóng loại bỏ môi trường để so sánh.

Tạo và sao chép lỗi bằng nhật ký được chuyển lên mức tối đa.

Kiểm tra nhật ký hệ thống để báo động bất kỳ điều gì.

Nhìn vào ngày tệp và dấu thời gian để có cảm giác nếu sự cố có thể là phần giới thiệu gần đây.

Xem qua kho lưu trữ nguồn cho hoạt động gần đây trong các mô-đun có liên quan.

Áp dụng lý luận suy luận và áp dụng nguyên tắc Ockham's Razor.

Hãy sẵn sàng lùi bước và nghỉ ngơi sau sự cố.

+0

Các lỗi độc hại nhất là những lỗi phơi bày lỗi thiết kế cơ bản. Điều đó khiến tôi khóc. –

1

Tôi đã chọn những người trên web hoặc một số cuốn sách mà tôi không thể nhớ lại (nó có thể đã được CodingHorror ...)

Debugging 101:

  • Tái sản xuất
  • Từng bước thu hẹp phạm vi
  • Tránh Debuggers
  • Change Only One Thing tại một thời điểm

tâm lý Phương pháp:

  • gỗ Ấn Độ
  • Đừng Suy đoán
  • Đừng quá nhanh để Blame Tools
  • Hiểu Cả hai vấn đề và giải pháp
  • Nghỉ ngơi
  • Hãy xem xét Nhiều nguyên nhân

Phương pháp ngăn ngừa lỗi:

  • Monit hoặc thói quen lỗi tiêm riêng của bạn
  • giới thiệu Debugging Aids sớm
  • Loose Coupling và Thông tin Ẩn
  • Viết một thử nghiệm hồi quy để Ngăn chặn Re xảy ra

phương pháp kỹ thuật:

  • Báo cáo trơ vết
  • Tham khảo tệp nhật ký của sản phẩm của bên thứ ba
  • Tìm kiếm trên web cho Stack Trace
  • giới thiệu Design By Contract
  • Lau Clean Slate
  • liên tục Bugs
  • Explot Localility
  • giới thiệu Dummy Triển khai và lớp con
  • biên dịch/relink
  • Probe Điều kiện biên giới và các trường hợp đặc biệt
  • Kiểm tra phiên bản Phụ thuộc (bên thứ ba)
  • Kiểm tra Mã đã thay đổi Gần đây
  • Do not Trust Lỗi nhắn
  • Graphics Bugs
+0

Tôi thực sự thấy câu trả lời này khá hữu ích. Không hiểu tại sao nó bị gắn cờ -1. – Hexagon

+0

Câu trả lời hay. Đã +1. Chúng tôi gọi đó là "gỡ lỗi vịt cao su" quanh đây để tránh những dấu gạch dưới phân biệt chủng tộc có thể khiến bạn phải trả giá tiêu cực. – catbadger

0

phương pháp của tôi về gỡ lỗi là khác nhau, có lẽ vì tôi vẫn đang mới bắt đầu.

Khi gặp phải lỗi logic, dường như tôi sẽ thêm nhiều biến để xem giá trị nào đi đến đâu và sau đó tôi đi và gỡ lỗi từng dòng trong đoạn mã gây ra sự cố.

0

Tái tạo sự cố và tạo bộ dữ liệu thử nghiệm lặp lại chắc chắn là bước đầu tiên và quan trọng nhất để gỡ lỗi.

Nếu tôi có thể xác định lỗi lặp lại, tôi thường sẽ thử và cách ly các thành phần liên quan cho đến khi tôi xác định được vấn đề. Thường thì tôi sẽ dành một ít thời gian để loại trừ các trường hợp để tôi có thể khẳng định dứt khoát: Vấn đề không nằm trong thành phần X (hoặc xử lý Y, v.v.).

4

Cân nhắc việc giữ sách "Debugging" của David J Agans. Phụ đề là "9 quy tắc không thể thiếu để tìm kiếm ngay cả những vấn đề phần cứng và phần cứng khó nắm bắt nhất". danh sách các gỡ lỗi quy tắc của mình - có sẵn ở dạng tấm áp phích tại trang web (và có một liên kết cho cuốn sách, quá) là:

  • Hiểu được hệ thống
  • Làm cho nó thất bại
  • Quit suy nghĩ và tìm kiếm
  • Divide và chinh phục
  • Thay đổi một điều tại một thời điểm
  • Giữ một đường mòn kiểm toán
  • Kiểm tra các plug
  • Nhận một cái nhìn tươi
  • Nếu bạn không khắc phục được nó, nó không phải là cố định

Điểm cuối cùng là đặc biệt phù hợp trong ngành công nghiệp phần mềm.

+1

đây là một bản tóm tắt tuyệt vời. – JohnBob

0

Trước tiên tôi cố gắng nhân rộng lỗi, mà không thể sao chép lỗi về cơ bản là không thể trong một chương trình không tầm thường để đoán vấn đề.

Sau đó, nếu có thể, hãy giải mã trong một dự án độc lập riêng biệt. Có một vài lý do cho điều này: Nếu dự án ban đầu lớn thì khá khó để gỡ lỗi thứ hai nó loại bỏ hoặc làm nổi bật bất kỳ giả định nào về mã.

Tôi thường luôn có một bản sao VS mở khác mà tôi sử dụng cho các phần gỡ lỗi trong các dự án nhỏ và để kiểm tra các thường trình mà sau này tôi thêm vào dự án chính.

Khi đã sao chép lỗi trong mô-đun riêng, trận chiến gần như đã thắng.

Thỉnh thoảng không dễ dàng phá vỡ một đoạn mã, vì vậy trong những trường hợp đó tôi sử dụng các phương pháp khác nhau tùy thuộc vào mức độ phức tạp của vấn đề. Trong hầu hết các trường hợp giả định về dữ liệu dường như đến và cắn tôi vì vậy tôi cố gắng thêm nhiều xác nhận trong mã để đảm bảo giả định của tôi là chính xác. Tôi cũng vô hiệu hóa mã bằng cách sử dụng #ifdef cho đến khi lỗi biến mất. Loại bỏ sự phụ thuộc vào các mô-đun khác, vv .. loại từ từ xoay quanh con bọ giống như con kên kên ..

Tôi nghĩ mình không thực sự có ý thức, nó thay đổi khá nhiều nhưng nguyên tắc chung là để loại bỏ tiếng ồn xung quanh vấn đề cho đến khi nó là khá rõ ràng những gì nó được. Hy vọng tôi không có vẻ quá khó hiểu :)

1

Tôi tìm thời gian tốt nhất để "gỡ lỗi" là khi bạn đang viết mã. Nói cách khác, hãy phòng thủ. Kiểm tra các giá trị trả về, tự do sử dụng khẳng định, sử dụng một số loại cơ chế ghi nhật ký đáng tin cậy và ghi lại mọi thứ.

Để trực tiếp trả lời câu hỏi, cách hiệu quả nhất để tôi gỡ lỗi là đọc mã. Có nhật ký giúp bạn tìm mã có liên quan để đọc nhanh.Không đăng nhập? Dành thời gian cho nó vào. Nó có thể không giống như bạn đang tìm lỗi, và bạn có thể không. Việc ghi nhật ký có thể giúp bạn tìm thấy một lỗi khác, và cuối cùng khi bạn đã trải qua đủ mã, bạn sẽ tìm thấy nó .... nhanh hơn việc thiết lập các trình gỡ rối và cố gắng tạo lại sự cố, một bước, v.v.

Trong khi gỡ lỗi, tôi cố gắng nghĩ về những vấn đề có thể xảy ra. Tôi đã đưa ra một hệ thống phân loại khá tùy ý, nhưng nó hoạt động cho tôi: tất cả các lỗi đều thuộc một trong bốn loại. Hãy ghi nhớ ở đây rằng tôi đang nói về các vấn đề thời gian chạy, không phải lỗi trình biên dịch hoặc trình liên kết. Bốn loại là:

  • cấp phát bộ nhớ động
  • stack overflow
  • uninitialized biến
  • lý lỗi

Các loại này đã được hữu ích nhất đối với tôi với C và C++, nhưng tôi mong đợi họ áp dụng khá tốt ở nơi khác. Danh mục lỗi logic là một danh mục lớn (ví dụ: đặt < b khi điều chính xác là < = b) và có thể bao gồm những thứ như không đồng bộ hóa quyền truy cập giữa các chuỗi.

Biết những gì tôi đang tìm kiếm (một trong bốn điều này) giúp ích rất nhiều trong việc tìm kiếm nó. Tìm lỗi luôn có vẻ khó khăn hơn nhiều so với việc sửa lỗi.

Các cơ thực tế để gỡ lỗi thường nhất:

  1. làm tôi có một bài kiểm tra tự động đó chứng tỏ vấn đề này?
    • nếu không, hãy thêm một thử nghiệm thất bại
  2. thay đổi mã để kiểm tra đi
  3. đảm bảo tất cả các bài kiểm tra khác vẫn vượt qua
  4. dấu check ở mục thay đổi

Không có thử nghiệm tự động trong môi trường của bạn? Không có thời gian như hiện tại để thiết lập nó. Quá khó để sắp xếp mọi thứ để bạn có thể kiểm tra từng phần của chương trình của mình? Dành thời gian để làm cho nó như vậy. Có thể làm cho nó mất quá nhiều thời gian để sửa lỗi cụ thể này, nhưng bạn càng sớm bắt đầu, mọi thứ sẽ nhanh hơn. Một lần nữa, bạn có thể không sửa lỗi cụ thể mà bạn đang tìm kiếm nhưng tôi đặt cược bạn tìm và sửa những người khác trên đường đi.

Các vấn đề liên quan