2012-03-06 32 views
6

Điều gì đang xảy ra khiến cho bản dựng gỡ lỗi bị chậm hơn nhiều so với trình gỡ rối so với không được đính kèm? Cả hai đều là cùng một exe đang chạy.Tại sao đang chạy kèm theo trình gỡ lỗi quá chậm?

Chỉnh sửa: Hầu hết các câu trả lời đều tập trung vào các điểm ngắt. Tôi vẫn chạy như bùn mà không có điểm ngắt, OutputDebugString, hoặc bất cứ thứ gì trong cửa sổ xem. Điều gì về gỡ lỗi CRT, kiểm tra ngăn xếp thời gian chạy, và đống gỡ lỗi?

+1

Bạn có bị mất bộ nhớ và đĩa không? – kenny

+0

No. ----------- – David

Trả lời

8

Nếu nó không phải là OutputDebugString hoặc cọc và đống breakpoint làm chậm tất cả mọi thứ xuống, hãy thử các:

  • của Windows debug đống - quá trình của bạn trở nên đống debug nếu nó đang chạy dưới một trình gỡ lỗi, không có câu hỏi. Để vô hiệu hóa điều này khi chạy trong trình gỡ rối Visual Studio, hãy truy cập trang gỡ lỗi của thuộc tính dự án và thêm _NO_DEBUG_HEAP=1 vào môi trường.

    (Windows debug đống là một điều tách biệt khỏi đống CRT debug. Phát hành trình của bạn sẽ nhận được debug đống Windows quá, nếu nó chạy theo một trình gỡ lỗi.)

  • Các lô tải chương trình của DLL mà có biểu tượng. Khi một DLL được nạp, Visual Studio cố gắng tìm các biểu tượng cho nó. Nếu có sẵn các biểu tượng, điều này có thể mất thời gian. Không có nhiều bạn có thể làm điều này ngoại trừ để sắp xếp lại chương trình của bạn để nó tải DLLs ít thường xuyên hơn.

  • Kiểm tra mọi cuộc gọi đến IsDebuggerPresent - điều này có thể giới thiệu sự khác biệt tùy ý giữa chạy trong trình gỡ lỗi và bên ngoài nó.

(Như một gợi ý throwaway cuối cùng - Tôi cũng nghi ngờ rằng trường hợp ngoại lệ (cho dù C++ hoặc cấu trúc) có thể là một chút tham gia nhiều hơn khi quá trình đang được sửa lỗi Vì vậy, nếu chương trình của bạn ném rất nhiều, có lẽ đó. có thể chậm hơn một chút khi nó đang được gỡ lỗi.)

+0

Bài viết tuyệt vời về _NO_DEBUG_HEAP = 1 http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger/ – watbywbarif

1

Bạn có rất nhiều ghi nhật ký qua OutputDebugString không? Đầu ra được tạo ra bởi OutputDebugString được nhận bởi một trình gỡ rối, nhưng bị bỏ qua khi không chạy dưới một trình gỡ lỗi.

+0

Không có trong dự án này, nhưng đó là một vấn đề hiệu suất lớn trong lần cuối cùng của tôi. – David

1

Có một vài lý do tại sao chạy với trình gỡ lỗi được đính kèm có thể chậm hơn đáng kể so với không được đính kèm. Nguyên nhân rất có thể là

  • số quá nhiều điểm break
  • Breakpoints có điều kiện đắt
  • Quá nhiều điểm dấu vết

Điều đầu tiên cần thử được vô hiệu hóa tất cả các điểm nghỉ ngơi và nhìn thấy như thế nào hiệu ứng perf

+0

Vô hiệu hóa các điểm ngắt đã tạo ra sự khác biệt, nhưng được gắn vào vẫn còn chậm hơn ~ 3 lần so với không bị gián đoạn. – David

3

Nếu trình gỡ lỗi của bạn sử dụng điểm quan sát phần mềm, nó thực hiện bước nội bộ và kiểm tra các điểm và thay đổi này trong biến valu es.

Trình gỡ rối [VS] chỉ có thể hỗ trợ 4 điểm ngắt dữ liệu phần cứng. Nếu bạn sử dụng các biểu thức (a + b), trình gỡ lỗi sử dụng chế độ mô phỏng.

Ngoài ra, việc tải thông tin gỡ lỗi cho thư viện chậm hơn và nó góp phần vào thời gian thực hiện cảm nhận (thời gian phản hồi).

Reference

+0

Bạn có thể liên kết nguồn của mình không? Tôi muốn đọc phần còn lại của bất cứ điều gì được viết ở đó. cảm ơn – David

+0

http://www.highprogrammer.com/alan/windev/visualstudio.html – perreal

+0

Tôi không tin! Single-steppping mã sẽ thực hiện quá nặng đến nỗi trình gỡ rối sẽ vô ích. Bạn có chắc không? Bước đơn có nghĩa là đối với mọi lệnh, một cái bẫy được tạo ra mà hạt nhân OS phải xử lý. Các mã sẽ chạy như nó trên một máy tính IBM 4.77 Mhz từ năm 1981. :) Tôi chưa bao giờ thấy bất cứ nơi nào gần hiệu suất xấu như vậy từ VS Debugger. Tôi sẽ nghĩ/hy vọng rằng các điểm ngắt phần mềm được thực hiện một cách an toàn, bằng phương pháp rõ ràng thay thế lệnh breakpoint với lệnh break trap (như int $ 3 trên x86). – Kaz

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