2011-09-03 38 views
7

Tôi từng tin rằng nếu chúng ta có một Debug build nó không thực sự quan trọng cho dù:Điều gì khác khi xây dựng Debug được chạy với gỡ lỗi và không gỡ lỗi?

  1. Chúng tôi chạy nó.
  2. Hoặc chúng tôi đã sửa lỗi.

mọi thứ sẽ giống nhau.

Tuy nhiên gần đây tôi đã gặp phải 2 vấn đề khác nhau, trong đó rõ ràng là có điều gì đó khác khi mã chỉ chạy hoặc khi nó được gỡ lỗi, ngay cả khi phiên bản mã được cho là giống nhau. (cụ thể là Fluent NHibernate cannot load MySql.Data from GAC in debug mode of a testNpgsql - Specified method is not supported)

Tôi tự hỏi sự khác biệt giữa hai thứ đó trong .NET 4.0 là gì? Hiểu biết những gì khác nhau có thể có thể giúp tôi giải quyết các vấn đề tôi đang gặp bởi vì tôi sẽ ít nhất biết nơi để tìm nguyên nhân có thể có lỗi trong những trường hợp khác nhau. Tôi không hiểu nó khi tôi chạy đơn vị kiểm tra tất cả các màu xanh lá cây, nhưng khi tôi cố gắng gỡ lỗi chúng tôi nhận được ngoại lệ khác nhau ném ..

Trả lời

4

Vũ khí được lựa chọn cho các sự cố có độ phân giải là fuslogvw.exe, nó cho bạn thấy nơi nó tìm kiếm một assembly và cấu hình nào đang được sử dụng để báo cho CLR biết nơi lắp ráp.

Có chế độ lỗi phụ với loại hội đồng bạn gặp sự cố. Các nhà cung cấp dbase này thường được quản lý các trình bao bọc dựa trên các tệp DLL không được quản lý để hoàn thành công việc. Windows phải có khả năng tìm thấy các tệp DLL đó. Điều đó có xu hướng thất bại nếu chúng không được sao chép vào một thư mục nằm trên PATH hoặc được sao chép vào cùng thư mục với EXE chính. Đọc kỹ hướng dẫn triển khai cho các trình bao bọc này.

+0

điều này phải được khá gần với những gì đang diễn ra, cảm ơn. Nhưng bạn có thể giải thích "chế độ thất bại thứ cấp" là gì và "chế độ thất bại chính" là gì (nếu điều đó tồn tại), tôi không chắc liệu cách nói của bạn có phải là cái tên chung hay không. –

+0

Chính = khả năng đầu tiên có vấn đề: cấu hình không đúng, loại fuslogvw.exe sẽ hiển thị cho bạn. Trung học = vấn đề có khả năng tiếp theo: DLL Hell. –

1

Khi gỡ lỗi thời gian của mã sẽ hơi khác nhau, vì vậy nếu bạn ngồi các hàm bên trong quá dài. Vì vậy, nếu mã là thời gian nhạy cảm, bạn có thể chạy vào các lỗi lạ. Đó là tất cả những gì tôi có thể nghĩ đến.

+0

Tôi cũng không đề cập đến điều đó, vì điều tôi đang trải qua rõ ràng không liên quan đến điều này, và sự khác biệt lớn hơn nhiều (nếu bạn làm theo các câu hỏi) –

+0

Điều này đúng, nhưng tôi nghi ngờ NHibernate thông thạo có rất nhiều mã nhạy cảm với thời gian. – Phil

+0

Tôi không chắc chắn cả hai vấn đề được kết nối với nhb thông thạo, có vẻ là npgsql liên quan chủ yếu .. nó có nghĩa là cả hai có thể không vì lý do khác nhau, gây ra npgsql không có gì để làm với GAC (tôi nghĩ) và đó là lý do mysql đã thất bại –

-1

Có một số vấn đề cần phải cảnh giác.

1) Theo codeninja, thứ tự các thao tác có thể khác nếu bạn vi phạm mã.

2) Tệp có thể ở các vị trí khác nhau và đường dẫn có thể phân giải khác nhau. Điều này rất quan trọng khi bạn có các tài nguyên được nạp động, hoặc nơi các DLL được xây dựng và sao chép vào thư mục của trình cắm thêm. Theo gỡ lỗi bạn có thể vô tình tải sai.

3) Các biến quan sát trong trình gỡ lỗi có thể gây ra một đánh giá. Hãy tưởng tượng một thuộc tính tăng dần trường hậu thuẫn của nó và sau đó trả về giá trị tăng dần.

+0

1) Không, nếu bạn biết gỡ lỗi ứng dụng muiltthreaded, chỉ cần phá vỡ tất cả các chủ đề khác khi gỡ lỗi, do đó, chỉ có một thread được gỡ lỗi. Đó sẽ là cùng một orded hoạt động, nếu bạn đặt một breakpoing trong một dòng nguồn sau khi attaiching để chạy ứng dụng. –

+0

2) Không, chỉ cần bật tùy chọn gỡ lỗi để tìm nguồn phù hợp chính xác trong khi gỡ lỗi –

+0

3) Không, chỉ cần tắt đánh giá prorperties & biến, loại bỏ các tác dụng phụ –

1

Sự khác biệt là khi trình gỡ lỗi được đính kèm, nó có thể dừng khi ngoại lệ được ném mà nếu không sẽ bị bắt.

Các tùy chọn "Break khi ngoại lệ vượt AppDomain hoặc quản lý/ranh giới tự nhiên (Managed chỉ)" và "Enable Just My Code" trong Tools/Options/Debugging, và các tùy chọn trong Debug/Exceptions ... sẽ quyết định về những gì ngoại lệ trình gỡ lỗi của bạn sẽ bị ngắt khi được ném.

+0

không may là cài đặt đã được tắt trên máy của tôi và có lẽ đó là giá trị mặc định mà tôi không nhớ là đã từng cài đặt nó. –

+0

Bạn có bất kỳ điều gì được kiểm tra trong Gỡ lỗi/Ngoại lệ ... không? Và bạn có Just Code của tôi đã kiểm tra trong Tools/Options/Debugging? – plodoc

+0

hmm thực sự tôi đã có ngoại lệ thời gian chạy ngôn ngữ phổ biến (2 hộp kiểm), tôi đã uncheked chúng và nó xuất hiện vấn đề đã biến mất. Tại sao vậy? Tôi thích điều này hơn là cách tiếp cận fuslogvw. Tôi hiểu một ngoại lệ ném, tôi không hiểu tại sao thử nghiệm thất bại sau đó, tôi đoán ngoại lệ vẫn còn ném, nhưng kể từ khi tôi không phá vỡ nó, tôi nhận được con đường thực hiện khác nhau? –

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