2012-03-25 25 views
5

Tôi làm việc trên một ứng dụng trong C# 4.0 (VS2010), và tôi có một tình huống rất lạ. Một lỗi được báo cáo với tôi từ tất cả các nhóm và tôi luôn không thể tái tạo nó, cho đến khi một trong những nhà phát triển khác yêu cầu tôi nhấp đúp vào tệp thực thi và thực hiện theo kịch bản của lỗi thay vì khởi chạy nó từ VS2010.Sự khác biệt giữa Visual Studio sẽ khởi chạy một tệp thực thi và tự khởi chạy nó?

Sau một số nghiên cứu, tôi thấy rằng hầu hết các nhận xét về vấn đề này liên quan đến bộ nhớ heap chưa được khởi tạo và tương tự, nhưng trong ngữ cảnh C++. Tôi biết rằng C# tạo ra một lỗi thay vì cảnh báo nếu biến không được khởi tạo, vì vậy đây không phải là vấn đề, có thể là hầu hết.

Cả hai được xây dựng đều giống nhau trên máy tính của tôi và của người sử dụng, và bây giờ tôi biết rằng cách nhấn F5 (Bắt đầu với gỡ lỗi) không tạo ra các vấn đề, trong khi Ctrl + F5 làm. Vì vậy, câu hỏi không phải là sự khác biệt giữa cả hai (các câu hỏi khác đã giải quyết điều đó), nhưng đúng hơn: làm thế nào có thể đính kèm một trình gỡ lỗi vào một quá trình C# ảnh hưởng đến hành vi của nó?

Mã tạo kết nối qua mạng.

Trả lời

7

Vì vậy, câu hỏi đặt ra là: Làm cách nào để đính kèm trình gỡ lỗi vào quy trình C# ảnh hưởng đến hành vi của nó?

Bằng mọi cách. Nó ảnh hưởng đến tối ưu hóa JIT, thu thập rác, thời gian (nghĩ điều kiện chủng tộc), bất cứ điều gì rõ ràng cố gắng phát hiện xem nó đang chạy trong trình gỡ lỗi, và có khả năng thứ tự và thời gian khởi tạo kiểu. Nếu bây giờ bạn có thể tái tạo nó, tôi sẽ bắt đầu thêm ghi nhật ký và xem nơi dẫn bạn - khi bạn đã tìm ra vấn đề thực sự là gì, bạn có thể thấy rõ ràng lý do tại sao trình gỡ lỗi thay đổi mọi thứ.

+0

Lưu ý rằng các vấn đề nêu trên khi chạy trong trình gỡ rối, theo ý kiến ​​của tôi, nguyên nhân có khả năng nhất của lỗi là điều kiện chủng tộc giả định rằng mã không phát hiện rõ ràng rằng nó đang được chạy trong trình gỡ lỗi. Việc tối ưu hóa JIT và các vấn đề thu gom rác sẽ có nhiều khả năng biểu hiện dưới dạng lỗi trong bản dựng gỡ lỗi và không phải trong bản phát hành bản phát hành. – dotancohen

+0

[@JonSkeet, @dotancohen] Tôi đã cố gắng khắc phục sự cố này bằng cách tạo các hộp tin nhắn dọc theo các dòng của phương pháp có vấn đề. Trong thử nghiệm đầu tiên của tôi, tôi đã sản xuất một hộp thông báo từ dòng mã đầu tiên. Vấn đề không bao giờ xuất hiện nữa !! Điều gì có thể là nguyên nhân của điều này? Làm thế nào một hộp thông điệp có thể tạo ra sự khác biệt như vậy ?! – OmarOthman

+0

@OmarOthman: * Rất * dễ dàng - hộp tin nhắn * rất * xâm lấn, về mặt thời gian ảnh hưởng triệt để, v.v. Tôi khuyên bạn nên sử dụng ghi ít xâm lấn hơn ... lý tưởng chỉ chạm vào hệ thống tệp định kỳ, để giảm tác động thời gian vv –

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