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:


114

Đ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.


1
"Kết quả là 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". Yup, giảm hôi của này sử dụng khung ngăn xếp để có được tên của phương pháp hiện tại / tài sản - và rất nhiều các thuộc tính đã inlined trong phiên bản ...
kpollock

4
"Điều quan trọng nhất là trong chế độ Gỡ lỗi không có tối ưu hóa" - điều đó có thể lập luận. điều quan trọng nhất là có thông tin gỡ lỗi cho phép bạn gỡ lỗi. mặc dù điều đó cũng có thể tồn tại trong bản phát hành.
shoosh

Tôi không biết đâu là chế độ mặc định (Gỡ lỗi / Phát hành). Nói chung theo kinh nghiệm của tôi, tất cả các dự án đều ở chế độ gỡ lỗi và nhóm trình cài đặt sẽ chăm sóc bản phát hành này để tránh tệp pdb và giới thiệu tối ưu hóa. Nhưng hôm nay tôi đã gặp một tình huống là chế độ được thay đổi để phát hành và tôi không thể phá mã bằng cách sử dụng điểm ngắt. Tôi đã cố gắng trong 1 giờ dài để làm rất nhiều thứ và cuối cùng tôi nhận thấy rằng đó là do vấn đề với chế độ biên dịch hiện tại. @ Vlix- Cảm ơn câu trả lời của bạn.
kbvishnu

1
Điều này thực sự đã giúp tôi giải quyết vấn đề "Tên 'biến' không tồn tại trong ngữ cảnh hiện tại" mà tôi gặp phải khi cố gắng phân tích một biểu tượng trong cửa sổ ngay lập tức trong khi gỡ lỗi một ứng dụng tuân theo cấu hình Phát hành mặc định. Cảm ơn rất nhiều!
M463

1) Còn những vấn đề sau? Có 3 cấu hình trong một dự án ASP.NET MVC: cơ sở (web), gỡ lỗi (web.debug), phát hành (web.release). Giả sử chúng tôi đặt chuỗi kết nối gỡ lỗi và phát hành bằng cách chuyển đổi thành cấu hình tương ứng (gỡ lỗi và phát hành). Khi xuất bản, chúng tôi có thể xuất bản theo lựa chọn của mình trong hộp thoại xuất bản. Nhưng, khi chạy ứng dụng, mặc dù tôi chọn Gỡ lỗi, nó sử dụng cấu hình phát hành (vì tôi đặt cấu hình gỡ lỗi trong cơ sở và cấu hình gỡ lỗi), điều đó có bình thường không?
Jason

52

"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:

  • Các tệp Cơ sở dữ liệu gỡ lỗi chương trình, cho phép bạn theo dõi khá chặt chẽ việc thực thi chương trình trong nguồn trong thời gian chạy.
  • Tất cả các tối ưu hóa bị tắt, điều này cho phép bạn kiểm tra giá trị của các biến và theo dõi các hàm có thể đã được tối ưu hóa đi hoặc trong hàng
  • Định nghĩa tiền xử lý _DEBUG cho phép bạn viết mã hoạt động khác nhau trong chế độ gỡ lỗi so với khi phát hành, chẳng hạn như ASSERT công cụ chỉ nên được sử dụng trong khi gỡ lỗi
  • Liên kết đến các thư viện cũng đã được biên dịch với các tùy chọn gỡ lỗi trên, thường không được triển khai cho khách hàng thực tế (vì lý do kích thước và bảo mật)

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.


5
"chỉ có hai nhãn" - trên thực tế, Visual Studio cung cấp cho bạn khả năng tạo nhiều hơn! Điều này có thể đặc biệt hữu ích trong khi thử nghiệm một chương trình. Ví dụ, gần đây tôi đã viết một chương trình cho công việc của mình, nó chấp nhận tên tệp từ dòng lệnh. Tôi đã thử nghiệm phân tích cú pháp dòng lệnh của mình, nhưng khi điều đó được thực hiện, tôi không muốn gây rối với CMD và danh sách tên tệp mỗi ngày; Tôi đã tạo một cấu hình mà tôi có thể sử dụng biên dịch có điều kiện để cung cấp các giá trị dòng lệnh giả và kiểm tra logic nghiệp vụ của chương trình, điều này mang lại cho tôi chu kỳ lặp lại nhanh hơn nhiều trong quá trình phát triển của chương trình.
Brian S

9

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.


1) Còn những vấn đề sau? Có 3 cấu hình trong một dự án ASP.NET MVC: cơ sở (web), gỡ lỗi (web.debug), phát hành (web.release). Giả sử chúng tôi đặt chuỗi kết nối gỡ lỗi và phát hành bằng cách chuyển đổi thành cấu hình tương ứng (gỡ lỗi và phát hành). Khi xuất bản, chúng tôi có thể xuất bản theo lựa chọn của mình trong hộp thoại xuất bản. Nhưng, khi chạy ứng dụng, mặc dù tôi chọn Gỡ lỗi, nó sử dụng cấu hình phát hành (vì tôi đặt cấu hình gỡ lỗi trong cơ sở và cấu hình gỡ lỗi), điều đó có bình thường không?
Jason

2) Khi chạy ứng dụng ở chế độ Gỡ lỗi hoặc Phát hành, VS có sử dụng cấu hình web cơ sở hoặc cấu hình web tương ứng (web.debug.confg hoặc web.release.config) không?
Jason

7

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).


2
@Vilx: khi tôi quay lại, vẫn chưa có thẻ .net, chỉ có visualstudio. Vì vậy, tôi giả định đó là C ++.
NeARAZ

6

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 .


Nhưng chỉ dành cho .NET (không phải C ++)?
Peter Mortensen

6

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ó 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ế.


"... thay đổi đáng kể ... logic kinh doanh thực tế" - tôi nghe có vẻ như một lỗi! Chúng ta có rất nhiều mã điều kiện và nó thực sự khó hiểu. Ngoài ra, mỗi tổ hợp cờ mã có điều kiện về cơ bản là một phiên bản phần mềm khác nhau của bạn cần được kiểm tra để đảm bảo tính đúng đắn và tính toàn vẹn cơ bản. Theo "Code Complete", Kinh thánh xây dựng phần mềm của tôi, "Chỉ thị chính" của chúng tôi là quản lý sự phức tạp. (Đó là vấn đề số 1 của chúng tôi cần giải quyết). Hãy suy nghĩ thật lâu và thật kỹ trước khi thêm một cách bừa bãi các cờ điều kiện!
MicroservicesOnDDD

Nhận xét trên của tôi không nhằm vào câu trả lời này đặc biệt cho đến câu cuối cùng ... đó chỉ là một điều bổ sung mà tôi nghĩ rằng độc giả đến đây nên đọc.
MicroservicesOnDDD

6

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.DLLtrong 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.


rất đúng. Ran đã vi phạm điều này một lần khi ở một khách hàng. Hoạt động trên Máy của tôi (TM).
Matt Jacobsen

Bạn có thể phân phối chúng .. (không biết bạn có được phép hay không). Chúng phải nằm trong một thư mục con tên riêng của ứng dụng của bạn.
Andreas Reiff

@Andreas Về ví dụ của tôi, "không thể phân phối lại" có nghĩa là Microsoft không cho phép phân phối chúng.
foraidt

4

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 ...

VCXPROJs trống Debug so với Release diff

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.


3

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 .


-15

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.


7
Làm thế nào để trả lời câu hỏi này? Và hãy chú ý khi bạn đang gõ.
mmking

Tôi đã gặp sự cố tương tự, mã hoạt động ở chế độ gỡ lỗi nhưng lại gặp sự cố ở chế độ phát hành. Hóa ra vấn đề là ở mã của tôi. Có một bài viết rất hay về các vấn đề thường gặp trong phiên bản phát hành, hy vọng điều này cũng có thể giúp ích cho những người khác.
Weihui Guo
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.