Cách cải thiện khả năng gỡ lỗi mã hiện tại [đã đóng]


Câu trả lời:


32

Đừng giả sử bất cứ điều gì

Nó thường hấp dẫn khi chỉ nói "ồ, tôi biết đoạn mã này đang làm gì, nó ổn". Đừng làm vậy. Kiểm tra mọi giả định và bước qua mọi thứ cẩn thận.


2
+1. Chắc chắn rồi. Hãy chuẩn bị để ngạc nhiên bởi một số thứ, bạn nghĩ rằng bạn biết, sẽ giở trò đồi bại với bạn.
aufather

làm việc cho tôi :)
setzamora

3
Gỡ lỗi mã của người khác là một công cụ dọn dẹp thời gian khổng lồ, kẻ giết người năng suất, nhưng đó là như vậy. Lần duy nhất thực sự có ý nghĩa để sửa lỗi của người khác là khi họ đã rời đi. Điều tôi ghét HATE HATE là thông qua một số mã khách quan ngu ngốc của một lập trình viên cao cấp, sau đó phải đặt câu hỏi để tiến bộ kịp thời và có được một bài giảng về cải thiện kỹ năng của tôi trong việc học cơ sở mã hiện có. Không giống như nghiên cứu về bản chất mẹ, việc giải quyết các vụ lừa đảo do con người gây ra hầu như không thú vị. Ít nhất tôi nhận được câu trả lời của mình. Tình huống ngược lại sẽ không xảy ra, vì tôi chỉ khá hơn và để lại ít lỗi hơn.
Công việc

1
@Job: ... được chứ? Có phải bạn muốn để lại bình luận này trên bài viết, có lẽ? :)
Adam Lear

Điều này! Thật ngớ ngẩn khi tin tưởng một cách mù quáng bất kỳ một chút mã nào của bạn nếu bạn gỡ lỗi một vấn đề kỳ lạ và mã có vẻ ổn.
Dan

7

Kiểm tra tăng dần .

Trước tiên hãy đi sâu vào mã của bạn và kiểm tra nó từ mô-đun nhỏ nhất di chuyển dần lên. Theo cách này, bạn không phải chịu quá nhiều căng thẳng khi cố gắng tìm ra vấn đề chính xác có thể xảy ra.

Điều đó cũng có nghĩa là nó ảnh hưởng đến ít mã hơn tại một thời điểm vì bạn đang di chuyển tăng dần..những lúc tôi gặp vấn đề khi tôi sửa một cái gì đó và điều đó dẫn đến phá vỡ nhiều thứ khác. Tôi cung cấp tín dụng cho ông chủ của tôi cho điều này khi ông dạy tôi điều này khi tôi làm phiền.


4

Chia rẽ và chinh phục là một cách tiếp cận tốt. Cố gắng xác định một số đầu vào có thể nhìn thấy (đầu vào / sự kiện mạng của người dùng ...) và đầu ra (nhật ký, đầu ra cho người dùng, tin nhắn mạng bên ngoài ...) giữa vấn đề tồn tại. Hãy thử đặt các bản in ở các khối lớn hoặc các điểm quan trọng giữa chúng và cố gắng thu hẹp vị trí của lỗi trong mã.

Phân chia và chinh phục cũng có thể hoạt động rất tốt trong trường hợp hồi quy trên mã được kiểm soát phiên bản. Tìm hai bản dựng - một bản dựng ở đó hoạt động như mong đợi, bản kia có hồi quy. Thu hẹp khoảng cách xuống cho đến khi bạn bị bỏ lại với một loạt các checkin là nghi phạm tiềm năng.


4

Thay vì cắt lỗi nhị phân, hãy viết các bài kiểm tra theo mẫu

  • Được...
  • Khi nào...
  • Chờ đợi...

Để xác minh những gì bạn thực sự biết là đúng về chức năng của ứng dụng so với những gì bạn cho là đúng.

Hầu hết các IDE giúp dễ dàng trích xuất các phương thức và tạo ra các sơ đồ thử nghiệm xUnit. Hãy tận dụng điều đó.

Tại sao không rắc lỗi? Bởi vì sau khi bạn hoàn thành, bạn có thể sẽ phải hoàn tác phần lớn công việc đó và xóa một số lượng lớn các lỗi đó. Khi bạn viết bài kiểm tra, việc gỡ lỗi của bạn sẽ hỗ trợ ngăn ngừa và phát hiện các lỗi trong tương lai.


2

Tiếp tục gỡ lỗi. Nếu bạn gỡ lỗi nhiều, bạn sẽ cải thiện.


Bản thân việc gỡ lỗi hoàn toàn là trong nghệ thuật, đặc biệt là gỡ lỗi mã người khác.
Gratzy

2

Như những người khác đã nói - đừng giả sử bất cứ điều gì. Điều này đặc biệt đúng nếu mã của nó bạn đã viết. Khi gỡ lỗi mã người khác, bạn có nhiều khả năng làm chậm vì mã này là mới đối với bạn hoặc bạn không tin tưởng vào người viết mã. Khi gỡ lỗi mã của riêng bạn, quá dễ để cho rằng bạn đã viết đúng, chậm lại!

Đối với quá trình gỡ lỗi thực tế:

  • Viết bài kiểm tra đơn vị nếu chúng chưa tồn tại.
  • Thêm ghi nhật ký thích hợp nếu không tồn tại.
  • Sau đó sử dụng gỡ lỗi.

Thêm các bài kiểm tra đơn vị và đăng nhập trước tiên hiệu quả hơn bằng cách sử dụng trình gỡ lỗi trước tiên. Bạn cũng có được lợi thế bổ sung khi có các bài kiểm tra đơn vị để giúp không giới thiệu các lỗi trong tương lai và việc ghi nhật ký sẽ giúp gỡ lỗi các phiên trong tương lai.


1

Trước khi bước qua một đoạn mã nhỏ, hãy xem bạn có thể xác định chính xác kết quả hay không. Điều này không có xu hướng bay lên khi không giả định bất cứ điều gì (mà tôi đã bình chọn BTW) nhưng khi bạn có kinh nghiệm, nó có thể giúp thu hẹp nơi để tìm.

Điều này nghe có vẻ tầm thường, nhưng tìm hiểu các sắc thái của trình gỡ lỗi của bạn và tìm hiểu các phím nóng. Đôi khi các trình sửa lỗi có thể đủ chậm để tâm trí bạn tự hỏi khi bước qua. Nếu bạn có thể theo kịp máy và không di chuyển xung quanh, điều đó có thể giúp ích.

Nếu bạn có thể sửa đổi mã trong khi gỡ lỗi:

  • xem xét khẳng định điều kiện trước và bài. Đôi khi bạn có thể bước qua, thay vì vào mã.
  • vì nếu các câu lệnh có biểu thức phức tạp, hãy xem xét một cái gì đó (một số có thể nhăn mặt về điều này nhưng nó hiệu quả với tôi)

như:

bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
   // more code here
}

thay vì:

if ( a < 5 || a > 10 )
{
   // more code here
}

Đối với các trường hợp bạn không thể gỡ lỗi mọi thứ, vì bất kỳ lý do gì, hãy học cách "vịt cao su" với đồng nghiệp. Đôi khi hành động giải thích làm sáng tỏ. (ok, có lẽ điều này không chính xác trong chủ đề câu hỏi, nhưng tôi nghĩ nó đủ gần để đảm bảo đề cập)


1
Việc đặt tên cho các điều kiện con cần thêm một bước, cụ thể là tái cấu trúc các tên khi bạn tìm ra điều kiện để làm gì. Nó có thể trở thành if (tooCloseToHydrant || overTheBrink) { khi bạn tìm hiểu thêm sau này.

1

Hai điều, dựa trên việc dành hầu hết 22 năm qua để duy trì mã người khác viết.

Hiểu các loại lỗi bạn có xu hướng viết.

Ví dụ, tôi là một lập trình viên rất tỉ mỉ, vì vậy một khi mã của tôi biên dịch, nó thường không có các lỗi nhỏ. Vì vậy, lỗi của tôi có xu hướng là những thứ phức tạp kỳ lạ như bế tắc chủ đề. Mặt khác, tôi có một người bạn chủ yếu viết các lỗi nhỏ - dấu chấm phẩy ở cuối C ++ cho các vòng lặp, vì vậy dòng tiếp theo chỉ được thực thi một lần, kiểu đó.

Đừng cho rằng người khác viết cùng loại lỗi bạn làm.

Tôi không biết mình đã lãng phí bao nhiêu thời gian để rút ra những khẩu súng gỡ lỗi lớn, cho rằng một lỗi là loại điều kỳ lạ thực sự tinh vi của tôi, chỉ để bạn tôi nhìn qua vai tôi và nói, "Bạn có để ý thêm không dấu chấm phẩy? " Sau nhiều năm, lần đầu tiên tôi đi tìm trái cây tầm thường, treo thấp khi nhìn vào mã của người khác.


Bạn có định dạng lại mã để xem có gì di chuyển không?

@ Thorbjørn: Nếu tôi đã sở hữu mã, đôi khi tôi làm điều đó để cải thiện khả năng đọc, nhưng không tìm thấy lỗi chính tả. Ý tưởng thú vị!
Bob Murphy

bạn không phải cam kết, chỉ cần xem điều gì xảy ra. Tôi hoàn toàn có thể khuyên bạn nên thực thi một chính thể yêu cầu mã được định dạng lại - tốt nhất là tự động - khi được đăng nhập.

@ Thorbjørn: Tôi rất thích làm điều đó. Những gì bạn đề nghị như là một "prettifier" mã? Tôi chủ yếu làm việc trên Linux và Mac.
Bob Murphy

Tôi sử dụng Eclipse có sẵn cả hai vị trí và trình soạn thảo Java có hành động Lưu trữ xã hội nơi bạn có thể chỉ định điều gì sẽ xảy ra mỗi khi tệp được lưu. Ở đây một trong các tùy chọn là định dạng nguồn. Chúng tôi là một nhóm nhỏ nên tôi chưa điều tra thêm về nó. Các nhóm có kinh nghiệm hơn cho phép các móc nối trước trong các hệ thống kiểm soát nguồn, cho phép một cam kết nguồn bị từ chối nếu nó được định dạng không chính xác. Rất hiệu quả.

1

Biết công cụ của bạn. Ví dụ: trình gỡ lỗi của Visual Studio có một tính năng tuyệt vời được gọi là TracePoints giống như các điểm dừng nhưng thay vì dừng mã của bạn thay vào đó lại chèn một câu lệnh theo dõi vào đầu ra gỡ lỗi.

Đọc sách hoặc tham gia một lớp học về cách sử dụng trình gỡ lỗi của bạn rất được khuyến khích. Tôi đã tham gia một vài lớp học và đọc một vài cuốn sách của John Robbins, điều này tạo ra sự khác biệt lớn trong hiệu quả của tôi với tư cách là một người sửa lỗi.


0

Hiểu chức năng những gì mã đang cố gắng làm. Nếu bạn không biết bức tranh hoàn chỉnh (tất cả các trường hợp thử nghiệm, mã này phải vượt qua), thật khó để gỡ lỗi đúng cách mà không đưa ra các lỗi mới


0

Viết kiểm tra đơn vị tự động và các loại tích hợp và kiểm tra chức năng khác.

Bạn càng có nhiều bài kiểm tra tự động, bạn càng cần ít thời gian hơn cho trình gỡ lỗi.

Ngoài ra, thiết kế tốt - nguyên tắc RẮN. Nếu bạn đang viết các lớp nhỏ, tập trung và ưu tiên sáng tác hơn kế thừa, loại bỏ trùng lặp, v.v., thì mã của bạn sẽ luôn dễ dàng hơn để gỡ lỗi.

Tôi thấy rằng mã được thiết kế tốt sẽ tạo ra một tập hợp các lỗi khác mà mã không được thiết kế tốt. Nói chung, mã được thiết kế tốt sẽ tạo ra các lỗi dễ tìm, tái tạo và sửa chữa hơn.

Ngoại lệ (và luôn có một) là mã đa luồng :-)


0

Nếu bạn đã thu hẹp phạm vi xuống một khu vực nhỏ, nhưng vẫn không thể phát hiện ra lỗi, hãy thử tùy chọn 'xem mã + lắp ráp' của trình gỡ lỗi của bạn. Biết đủ ASM để nói "nên có một chi nhánh ở đây" hoặc "tại sao nó chỉ sao chép từ thấp?" sẽ thường xác định chính xác lỗi mã hóa.


0

Hãy xem cuốn sách rất có giá trị Tại sao các chương trình thất bại: Hướng dẫn về gỡ lỗi có hệ thống , của Andreas Zeller. Nó sẽ giới thiệu cho bạn nhiều kỹ thuật, lý thuyết và công cụ, một số trong số đó là tiên tiến của nghiên cứu.

Các slide cho cuốn sách có sẵn trực tuyến, nhưng tôi thấy bản thân cuốn sách dễ đọc hơn.

Cuốn sách sẽ giúp bạn bắt đầu và khiến bạn suy nghĩ khoa học hơn về việc gỡ lỗi, nhưng nó không thay thế cho thực tiễn. Bạn có thể cần phải viết và gỡ lỗi trong 10 năm trước khi bạn thấy một thứ tự cải thiện cường độ trong hiệu suất của bạn. Tôi vẫn còn nhớ việc thả hàm của mình tại Sun khi thấy các nhà phát triển cấp cao, những người đã lập trình cho Unix trong 30 năm, tìm thấy các lỗi đa luồng hoặc song song tối nghĩa trong vài phút. Vấn đề kinh nghiệm!


Phần mềm tự động của họ trông rất thú vị.
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.