2010-02-12 33 views
12

Có một tiêu chuẩn (ví dụ: được thực hiện bởi tất cả các trình biên dịch chính) #define sẽ cho phép tôi phân biệt giữa các bản dựng gỡ lỗi và bản phát hành không?C/C++: Cách di động để phát hiện gỡ lỗi/phát hành?

+1

Trên thực tế dự án lớn mà tôi làm việc, chúng tôi tiếp tục gỡ lỗi trong bản phát hành của mình, nhưng có nó xác định độ trong thời gian chạy. Nó đã được chứng minh hữu ích trong việc săn tìm lỗi trong tự nhiên, với mức tối thiểu (_very_ khó để thông báo; không có khiếu nại người dùng) khi không được kích hoạt. Bên ngoài môi trường nhúng, tôi sẽ xem xét một cách tiếp cận như vậy. – mctylr

+0

"Bản phát hành bản phát hành" là gì? Tiêu chuẩn C++ không định nghĩa nó, vì vậy không có cách nào để phát hiện ra một thứ gì đó có phải là bản phát hành hay không. – jalf

Trả lời

13

nếu tin

#ifdef NDEBUG 
    // nondebug 
#else 
    // debug code 
#endif 

là di động nhất.

Nhưng no trình biên dịch biết bạn đang biên dịch gỡ lỗi hay phát hành, vì vậy đây không phải là tự động. Nhưng cái này được sử dụng bởi assert.h trong c-runtime, vì vậy nó khá phổ biến. Visual Studio sẽ thiết lập nó, và tôi chắc chắn hầu hết các IDE khác sẽ là tốt.

+0

thiếu một _ ở mặt trước cho biết nó có thể được đề cập trong tiêu chuẩn C hoặc C++ ở đâu đó. MS đã rất rất cẩn thận trong các bản phát hành cuối cùng để tiền tố bất kỳ macro hoặc hàm không chuẩn nào trong tệp tiêu đề c-runtime của chúng với '_'s –

+5

Điều đó không giống nhau. Định nghĩa NDEBUG sẽ tắt các macro khẳng định. Không có gì khác. Điều này làm __NOT__ ngụ ý gỡ lỗi. –

+3

@Martin: nondebug thực sự. và nếu nó được dự định để _only_ tắt các macro khẳng định, họ sẽ gọi nó là NOASSERT. bạn thực sự nên đọc những gì tôi đã viết trước khi bạn bắt đầu lấy điểm. –

0

Chỉnh sửa: Tôi đã đọc sai câu hỏi và suy nghĩ về một tiếp tuyến khác nhau !!! Xin lỗi ... Macro _NDEBUG được sử dụng trên Linux cũng như trên Windows ...

Nếu nhị phân được tạo và bạn cần xác định xem bản dựng đã được phát hành/gỡ lỗi, bạn có thể nhận được kết xuất thập lục phân, nếu bạn thấy vô số các biểu tượng trong đó sẽ là thông tin gỡ lỗi ... ví dụ, dưới Linux, sử dụng tiện ích strings. Có một phiên bản dành cho Windows của SysInternals, có sẵn tại đây trên technet. các phiên bản phát hành thực thi nhị phân sẽ không có chuỗi đại diện cho biểu tượng khác nhau ...

 
strings some_binary 

Hope this helps, Trân trọng, Tom.

+0

Không nhất thiết phải đúng; có thể tạo các tệp nhị phân có ký hiệu (tức là đối với các hàm và dữ liệu tĩnh) nhưng không thể gỡ lỗi thông tin (tức là số dòng). –

+0

Điều đó nói rằng, cờ cung cấp thông tin đó thường được lưu trữ trong tiêu đề của bất kỳ định dạng tệp đối tượng nào. Hãy thử GNU objdump (cũng có phiên bản dành cho Windows, được phân phối với MinGW): objdump -x –

3

Vì không có định nghĩa chuẩn về gỡ lỗi hoặc phát hành, không có cách nào để thực hiện việc này. Tôi có thể nghĩ ra ít nhất bốn thứ khác nhau có thể có nghĩa là, và tất cả chúng có thể được thay đổi độc lập. Chỉ có hai có thể được kiểm tra từ bên trong mã.

  1. mức tối ưu hóa trình biên dịch
  2. ký Debugging bao gồm trong hệ nhị phân (những thậm chí có thể được gỡ bỏ vào ngày hôm sau)
  3. assert() được kích hoạt (NDEBUG không được định nghĩa)
  4. logging tắt
Các vấn đề liên quan