Bạn đã vận chuyển, bạn nhận được một lỗi seg hiếm. Kiểm tra con trỏ hay để nó đi?


9

Bạn đã giao hàng, các xác nhận đã bị tắt, bạn nhận được một báo cáo sự cố hiếm gặp cho thấy rằng vi phạm con trỏ null đã xảy ra trong mã của bạn. Trong một môi trường phát triển, vấn đề sẽ bị bắt bởi một sự khẳng định.

Tất cả những gì bạn có là một báo cáo sự cố, vì vậy việc tái tạo vấn đề là gần như không thể. Theo dõi phần sau không đưa ra bất kỳ manh mối nào về lý do tại sao vụ tai nạn xảy ra ngay từ đầu.

Tùy chọn: - Thêm kiểm tra con trỏ để ngăn sự cố. Điều này sẽ ngăn chặn sự cố, nhưng có lẽ bạn thậm chí sẽ không tìm hiểu tại sao nó lại xảy ra ở nơi đầu tiên. - hãy để nó bay, hy vọng rằng nó sẽ xảy ra một lần nữa với kịch bản repro

Giả sử ứng dụng này không dành cho hệ thống phanh tự động hoặc hệ thống phanh tự động ...

bạn chọn cái nào?


Trừ khi điều này là ẩn dụ, có thể rất hữu ích khi đăng báo cáo sự cố cùng với các tệp mã tương ứng (có lẽ trên Pastebin.com) lên trang web Stack Overflow nếu bạn muốn giải quyết vấn đề này ...
Tamara Wijsman

2
@TomWij: Đừng nghĩ như vậy..tôi rất có thể sẽ bị đóng cửa vì "quá cục bộ"
Naveen

@Naveen: Có lẽ ... Tôi không phải là khách truy cập SO thường xuyên nên đây là một nhận xét SU-mind.
Tamara Wijsman

1
@Naveen: Quá cục bộ có nghĩa là quá khu vực, đó là về địa lý và không phải là chuyên môn hóa vấn đề. Nhưng câu hỏi này có lẽ sẽ bị đóng trên SO bởi sự chủ quan.
Maniero

Câu trả lời:


7

Tôi đã chọn cách tiếp cận thứ hai. Không có điểm nào để che giấu sự cố nếu con trỏ NULL bất ngờ tại điểm xảy ra sự cố. Con trỏ NULL này trong hầu hết các trường hợp sẽ chỉ là một trong những triệu chứng của một cái gì đó khác là sai. Nếu chúng ta ẩn nó bằng một con trỏ NULL, thì gần như chắc chắn rằng một cái gì đó khác sẽ bị hỏng. Tôi cảm thấy bạn có cơ hội tốt hơn để nắm bắt kịch bản nếu bạn biết điểm mà nó gặp sự cố mọi lúc thay vào đó tại một địa điểm ngẫu nhiên.


1
Tôi đang nghiêng về ý kiến ​​này bản thân mình. Nhận thức của người dùng là điều làm tôi lo lắng. Một vụ tai nạn rõ ràng có vẻ như đã xảy ra sự cố. Tuy nhiên, nếu một tính năng nhận được một tính toán hoàn toàn sai, điều này cũng sẽ được chú ý.
MM01

2
Theo tôi, mặc dù người dùng có thể bị kích thích bởi sự cố thường xuyên, họ sẽ thực sự khó chịu nếu nó cung cấp kết quả sai vì nó có thể không được chú ý.
Naveen

sụp đổ càng sớm càng tốt, nó giúp bạn tìm ra vấn đề và nó giúp người dùng mất ít dữ liệu hơn
Spudd86

Ngoài ra, tôi sẽ sử dụng valgrind để tìm hiểu xem tôi đã làm gì sai (hoặc ít nhất là tôi đã thử, trong mọi trường hợp có thể tìm thấy một số vấn đề bạn nên khắc phục) Tôi đã thêm các xác nhận bổ sung để thử bắt con trỏ NULL trước đó và yêu cầu người dùng thử chạy một bản dựng đã bật xác nhận trong một thời gian để xem liệu họ có thể khiến nó bị sập sớm hơn không
Spudd86

3
  1. Làm thế nào thường xuyên xảy ra vụ tai nạn? Nó xảy ra chỉ cho một trong nhiều khách hàng trong một số trường hợp tối nghĩa? Hậu quả (mất dữ liệu, sự cố hệ thống) là gì? Nếu nó xảy ra cứ 1 triệu trong một triệu trường hợp và họ chỉ cần khởi động lại ứng dụng và không có dữ liệu nào bị mất thì có lẽ bạn không cần phải sửa nó - cứ để như vậy.

  2. Làm thế nào tốn kém (tiền và thời gian) để thêm các xác nhận và gửi nó cho tất cả khách hàng (nếu chỉ là một phần của khách hàng nhận được phiên bản mới thì phần còn lại có thể gặp phải vấn đề không được kiểm tra)? Cơ hội tìm thấy vấn đề là gì? Nếu bạn chỉ đặt kiểm tra ngẫu nhiên trong mã với hy vọng bắt được lỗi thì đó là một thực tế tồi ...

  3. Vấn đề có thể được sao chép trên máy của khách hàng? Bạn có thể truy cập vào máy đó? Điều này có thể thực sự có giá trị

  4. Xem lại báo cáo sự cố của bạn và đảm bảo thông tin được cung cấp là hữu ích và có thể giúp bạn chẩn đoán sự cố


2

Trong một môi trường phát triển, vấn đề sẽ bị bắt bởi một sự khẳng định.

Theo một thứ tự cụ thể, nó sẽ bị bắt và sửa, nhưng dấu vết ngược hiện tại chưa bao giờ bị bắt.
Bạn sẽ có thể thấy những gì đã xảy ra với bãi chứa sự cố, bạn đã kiểm tra các thông số, v.v ...?

Các tính năng bổ sung có thể được thực hiện dựa trên lượng thời gian bạn muốn đưa vào đây:

  • Lưu trữ bãi chứa sự cố và tham chiếu nó trong mã với một nhận xét tại dòng nó bị hỏng,
    điều này cho phép người kiểm tra một bãi chứa chrash rất giống nhau để biết rằng nó đã xảy ra trước khi ...
    [thời gian sử dụng: ngắn]

  • Kiểm tra bổ sung, đăng nhập, ... Bạn muốn ngăn chặn và nhận thêm thông tin vào lần tới.
    [thời gian sử dụng: trung bình]

    Vi phạm con trỏ Null xảy ra trong mã của bạn.

  • Kiểm tra xem không thể gọi ứng dụng theo cách như vậy để vi phạm này xảy ra.
    [thời gian sử dụng: dài]


1
Bài đăng này không phải là quá nhiều về cách tiếp cận để giải quyết vấn đề, mà là quá trình hành động trong một tình huống giả định (tức là trong khung thời gian được phân bổ, không thể suy ra nguồn gốc của vấn đề).
MM01

2

Những ngày này, tôi gửi với assert () bật. Nó không tốn nhiều tiền và nó có thể làm cho cuộc sống dễ dàng hơn rất nhiều trong các tình huống thù địch (ví dụ, môi trường của khách hàng của bạn thường thù địch hơn môi trường dev hoặc QA của bạn).

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.