[Visual Studio] Debug và Release trong Visual Studio

Khi làm việc với Visual Studio chúng ta sẽ không còn xa lạ với 2 chế độ Debug và Release.
Vậy sự khác nhau giữa build ở chế độ Debug và Release có gì khác nhau ?

Debug :

  • Dành cho lập trình viên tìm và gỡ lỗi.
  • Xuất ra file .pdb (Program Database File) chứa các thông tin debug.
  • Cho phép đặt break point và chạy lần lượt từng dòng lệnh, xem giá trị của biến.
  • Khi ném ra Exception cung cấp Stack Trace để biết chính xác class, method hay dòng lệnh lỗi.
  • Không tối ưu (optimizes) code.
  • Ứng dụng chạy chậm hơn Release.

Release :

  • Dành cho người sử dụng ứng dụng.
  • Tối ưu (optimizes) code. Trình biên dịch có thể sẽ biên dịch khác so với code bạn đã viết. Nên nếu có Exception được ném ra sẽ không chính xác về class, method hay dòng lệnh.
  • Chạy nhanh hơn Debug.

Chú ý:

Chương trình chạy trong chế độ debug và release có thể cho kết quả khác nhau, vì vậy trong quá trình phát triển ta phải chạy thử cả 2 chế độ để kiểm tra xem có lỗi xảy ra ko.

Mình ví dụ chương trình (C++) có sự khác nhau giữa Debug và Release

#include <iostream>

#include <thread>

#include <chrono>

using namespace std;

int val = 10;

void ThreadFunc()

{

   this_thread::sleep_for(chrono::seconds(5));

   val++;

}

int main() 

{

   thread t(ThreadFunc);

   while (val == 10)

   {
      //TODO
   }

   cout << "End main!" << endl;

}

Debug :

Trong chế độ debug, biến val không bị optimize, nên khi biến val được thay đổi trong thread sẽ thông báo đến hàm main, khi đó chương trình chạy như mong muốn hết 5 giây biến val = 11 và thoát khỏi vòng lặp while, hiển thị “End Main!”

Release :

Trong chế độ release biến val bị optimize, nên hàm main sẽ không biết đến sự thay đổi của biến val trong thread nên vòng while() bị lặp vô hạn. Chương trình chạy khác với chế độ debug ở trên.

=> Để fix bug này bạn có thể khai báo lại biến val là :

volatile int val = 10;

Để hiểu hơn về biến volatile xem lại bài viết mutable và volatile trong C++

Leave A Comment?