Có thể có bản phát hành Visual Studio Debug trùng lặp trong .NET
Sự khác biệt giữa Gỡ lỗi và Phát hành trong Visual Studio là gì?
Có thể có bản phát hành Visual Studio Debug trùng lặp trong .NET
Sự khác biệt giữa Gỡ lỗi và Phát hành trong Visual Studio là gì?
Câu trả lời:
Điều quan trọng nhất là ở chế độ Gỡ lỗi không có tối ưu hóa, trong khi ở chế độ Phát hành có tối ưu hóa. Điều này rất quan trọng vì trình biên dịch rất tiên tiến và có thể thực hiện một số cải tiến cấp thấp khá phức tạp đối với mã của bạn. Do đó, một số dòng mã của bạn có thể bị bỏ lại mà không có bất kỳ hướng dẫn nào hoặc một số dòng có thể bị trộn lẫn. Không thể gỡ lỗi từng bước. Ngoài ra, các biến cục bộ thường được tối ưu hóa theo những cách bí ẩn, vì vậy Đồng hồ và Đồng hồ nhanh thường không hoạt động vì biến đã được "tối ưu hóa đi". Và cũng có vô số các tối ưu hóa khác. Đôi khi hãy thử gỡ lỗi mã .NET được tối ưu hóa và bạn sẽ thấy.
Một điểm khác biệt chính là vì điều này, cài đặt Bản phát hành mặc định không bận tâm đến việc tạo thông tin ký hiệu gỡ lỗi mở rộng. Đó là tệp .PDB mà bạn có thể đã nhận thấy và nó cho phép trình gỡ lỗi tìm ra hướng dẫn lắp ráp nào phản ứng với dòng mã nào, v.v.
"Gỡ lỗi" và "Bản phát hành" thực chất chỉ là hai nhãn cho toàn bộ một loạt cài đặt có thể ảnh hưởng đến việc xây dựng và gỡ lỗi của bạn.
Trong chế độ "Gỡ lỗi", bạn thường có những điều sau:
Trong chế độ "Phát hành", tối ưu hóa chế độ được bật (mặc dù có nhiều tùy chọn khả dụng) và định nghĩa tiền xử lý _DEBUG không được xác định. Thông thường, bạn vẫn muốn tạo các tệp PDB, vì nó rất hữu ích để có thể "gỡ lỗi" ở chế độ phát hành khi mọi thứ đang chạy nhanh hơn.
Hầu hết, gỡ lỗi bao gồm rất nhiều thông tin bổ sung hữu ích khi gỡ lỗi. Trong chế độ phát hành, tất cả điều này được cắt và đổi lấy hiệu suất.
Nếu bạn xem xét các tùy chọn biên dịch dự án và so sánh chúng, bạn sẽ thấy sự khác biệt là gì.
Giả sử câu hỏi là về mã gốc / C ++ (nó không hoàn toàn rõ ràng về cách viết):
Về cơ bản, trong Gỡ lỗi, tất cả các tối ưu hóa tạo mã đều bị tắt. Một số thư viện (ví dụ: STL ) mặc định kiểm tra lỗi chặt chẽ hơn (ví dụ: trình vòng lặp gỡ lỗi). Thêm thông tin gỡ lỗi được tạo (ví dụ: "Chỉnh sửa và Tiếp tục"). Nhiều thứ khác được tạo ra trong mã để bắt lỗi (các giá trị biến cục bộ được đặt thành một mẫu chưa được khởi tạo và đống gỡ lỗi được sử dụng).
Ngoài ra, rõ ràng, chế độ Gỡ lỗi tạo ra rất nhiều chuỗi bổ sung để giúp gỡ lỗi. Chúng vẫn hoạt động trong suốt vòng đời của quy trình, bất kể bạn có đính kèm trình gỡ lỗi hay không. Xem câu hỏi liên quan của tôi ở đây .
Có lẽ điều đáng nói là rất rõ ràng, cờ xây dựng cho phép các logic khác nhau nên được sử dụng chỉ để thay đổi việc ghi nhật ký và thông báo "bảng điều khiển", nhưng nó có thể bị lạm dụng và thay đổi đáng kể không chỉ các cấp thấp mà còn cả logic nghiệp vụ thực tế.
Cũng lưu ý rằng khi sử dụng MFC chẳng hạn, các dự án gỡ lỗi liên kết với các phiên bản DLL không thể phân phối lại như MFC90D.DLL
trong khi phiên bản xây dựng phát hành liên kết với các phiên bản có thể phân phối lại như MFC90.DLL
. Điều này có lẽ tương tự với các khuôn khổ khác.
Do đó, bạn có thể sẽ không thể chạy các ứng dụng xây dựng gỡ lỗi trên các máy không phát triển.
Tôi cũng tò mò về câu hỏi này khi tôi đã phát triển một ứng dụng được sao chép từ cấu hình bản dựng Bản phát hành hiện có.
Tôi có một nhà phát triển thú vị khi sử dụng ứng dụng đó ở chế độ gỡ lỗi, vì vậy tôi tự hỏi sẽ cần những gì để tạo cấu hình bản dựng này tồn tại với tên ReleaseMyBuild được sao chép từ cấu hình Bản phát hành (và do đó, tất cả các cài đặt phải hướng đến việc phát hành tối ưu hóa ) để đột ngột thay đổi nhóm và trở thành một bản dựng gỡ lỗi mặc dù có tên cấu hình bản dựng khó hiểu.
Tôi nghĩ rằng cấu hình dự án chỉ là một cái tên và một cách thuận tiện để chọn "toàn bộ cài đặt" mà Joris Timmermans đề cập. Tôi muốn biết thực chất của những cài đặt đó có thể là gì khiến cấu hình bản dựng có tên "FOO" hoạt động như một bản dựng phát hành được tối ưu hóa .
Đây là một cái nhìn thoáng qua về nó. Tôi đã tạo một VCXPROJ mới từ mẫu dự án trống từ Visual Studio 2010. Sau đó, tôi sao chép nó và chỉnh sửa cả hai, lần đầu tiên giữ lại nội dung gỡ lỗi và lần thứ hai là nội dung phát hành. Đây là sự khác biệt tập trung vào những khác biệt có liên quan ...
GIẢI PHÓNG
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
NỢ
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
Điều thú vị là trong phần Liên kết cả hai đều GenerateDebugInformation
đặt thành true.
Sự khác biệt rõ ràng mà bạn có thể thấy là kích thước của hệ nhị phân. Bản dựng Gỡ lỗi tạo ra tệp nhị phân lớn hơn bản dựng Bản phát hành.
Khi biên dịch trong Gỡ lỗi, bảng biểu tượng được thêm vào đối tượng đã biên dịch của tệp mã, cho phép các chương trình gỡ lỗi khai thác vào các mã nhị phân này và truy cập giá trị của các đối tượng và biến.
Một sự khác biệt có thể quan sát được là, trong chế độ Phát hành, tệp nhị phân sẽ chỉ gặp lỗi nghiêm trọng trong khi ở chế độ Gỡ lỗi, nếu bạn bắt đầu gỡ lỗi ứng dụng trong Visual Studio, bạn có thể kiểm tra ngăn xếp cuộc gọi cho bạn biết vị trí chính xác của câu lệnh bị lỗi .
Tôi không biết sự khác biệt chính xác là gì vì thực sự không có thông tin dễ dàng có sẵn về điều đó.
Nhưng sự khác biệt chính được quan sát là phiên bản phát hành đôi khi làm hỏng tệp DLL kết quả và do đó làm cho ứng dụng của bạn, ứng dụng web không sử dụng được.
Đáng buồn thay, bạn phải đưa bản dựng gỡ lỗi vào sản xuất. Và vâng, để xuất bản bạn phải sử dụng FTP cũ tốt.