2009-03-17 32 views

Trả lời

97
Boolean isDebugMode = false; 
#if DEBUG 
isDebugMode = true; 
#endif 

Nếu bạn muốn chương trình hành vi khác nhau giữa debug và phát hành xây dựng bạn nên làm điều đó như thế này:

#if DEBUG 
    int[] data = new int[] {1, 2, 3, 4}; 
#else 
    int[] data = GetInputData(); 
#endif 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 

Hoặc nếu bạn muốn làm kiểm tra nhất định trên các phiên bản debug các chức năng bạn có thể làm điều đó như thế này:

public int Sum(int[] data) 
{ 
    Debug.Assert(data.Length > 0); 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 
    return sum; 
} 

Debug.Assert sẽ không được đưa vào bản phát hành.

+0

là OP hỏi về JIT Tối ưu hóa xây dựng? Nếu vậy, thì câu trả lời này là không chính xác. Thuộc tính Debug có thể được khai báo trong một bản dựng JIT được tối ưu hóa hoặc không được tối ưu hóa. –

11

Tôi hy vọng điều này có ích cho bạn:

public static bool IsRelease(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if ((d.DebuggingFlags & DebuggableAttribute.DebuggingModes.Default) == DebuggableAttribute.DebuggingModes.None) 
     return true; 

    return false; 
} 

public static bool IsDebug(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if (d.IsJITTrackingEnabled) return true; 
    return false; 
} 
+4

lý do tại sao cả hai chức năng có dòng này: nếu (thuộc tính == null || attributes.Length == 0) trả về true; Có sự cố với mã này. Tôi đã +1 nó như là câu trả lời cung cấp một cách lập trình thực sự chứ không phải là cách theo ngữ cảnh để có được lá cờ. đôi khi threre là một cần phải biết nếu wer'e trong chế độ gỡ lỗi được thể hiện như là một phần của mã chính nó chứ không phải là một lá cờ trình biên dịch. –

+1

DebuggableAttribute hiện diện nếu bạn biên dịch trong chế độ Release và chọn DebugOutput cho bất kỳ thứ gì khác ngoài "none". Vì vậy, câu trả lời này là không chính xác. Nó thậm chí không tìm kiếm cờ JIT Optimization. Hãy tham khảo bài đăng của tôi về cách nói sự khác biệt cả theo cách thủ công và theo chương trình - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I trì hoãn @DaveB về những khó khăn trong trường hợp này. Tuy nhiên, câu hỏi của bạn là một câu hỏi rộng và nếu bạn đơn giản muốn mã của bạn hoạt động khác nhau khi bạn đang thử nghiệm, tôi thấy bài kiểm tra này hữu ích (trong VB.Net) 'Nếu System.Diagnostics.Debugger.IsAttached Then DoSomething '(Chẳng hạn như có một mẫu hành vi khác nhau) ' –

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