2010-05-05 33 views
5

Điều này thật điên rồ. Nó bắt đầu xảy ra trong dự án chính của tôi, vì vậy tôi đã tạo ra một dự án mẫu hoàn toàn mới để tái sản xuất nó và chắc chắn đủ. Nó KHÔNG xảy ra trong một dự án mẫu mà tôi tạo ra chỉ là một ứng dụng giao diện điều khiển Win32.Vi phạm quyền truy cập MFC 200200 C++ CHỈ khi bước qua chế độ gỡ lỗi

Tôi đang chạy tính năng này trên Win7x64, nếu điều đó quan trọng. VS2008 SP1.

Đây. Tôi tạo một ứng dụng hộp thoại nhỏ bằng một nút. Đặt một điểm ngắt trong hàm xử lý cho nút đó. Chức năng xử lý nút trông giống như sau:

void CTestProjectDlg::OnBnClickedButton1() 
{ 
    int i; 

    i = 2; // < breakpoint here 
    i = 3; 

} 

Nhấp vào nút, nhấn điểm ngắt. F10 đến bước và bùng nổ: "Ngoại lệ cơ hội đầu tiên tại 0x0398f77b trong TestProject.exe: 0xC0000005: Vi phạm truy cập".

Nó cho tôi tùy chọn để Break hoặc Continue. Nếu tôi tiếp tục, nó chỉ đánh nó một lần nữa, không chỉ là "Cơ hội đầu tiên". Có, tôi đã kiểm tra ngoại lệ trong Debug-> Exceptions dlg.

Nếu tôi ngắt, ngăn xếp cuộc gọi chỉ hiển thị cho tôi dòng có điểm ngắt. Nếu tôi F10 một lần nữa .. Tôi nhận lại ngoại lệ, chỉ bây giờ callstack hiển thị cho tôi trong hàm _AfxDispatchCmdMsg() và OnBnClickedButton1() ban đầu của tôi không còn trong callstack nữa.

Việc đặt điểm ngắt không thành vấn đề.

Nếu, thay vì F10, tôi chỉ tiếp tục với F5, nó hoạt động bình thường.

Bây giờ .. nếu tôi xây dựng một phiên bản phát hành và chạy trong chế độ gỡ lỗi: Tôi nhấn điểm ngắt và tất cả các con trỏ, giá trị biến trông bình thường. F10, và chúng biến thành rác. Con trỏ này bây giờ là không. M_csHello hiện là

Tuy nhiên, trong chế độ Phát hành, ngoại lệ không bị bắt và tất cả đều chạy tốt. "Xin chào chuỗi thế giới được hiển thị trong hộp thoại như cần.

Tôi đã đặt trong một cuộc điều tra để xem một số bản vá đã được cài đặt trên hộp của tôi bởi các phòng CNTT trong ngày hoặc hai ngày qua. .? xảy ra 2 ngày trước

bạn nghĩ gì là VS2008 hỏng

Cảm ơn

Edit:?.. Thông tin bổ sung này không xảy ra nếu tôi xây dựng/debug nền tảng x64 Chỉ dành cho Win32..
Tôi cũng đã xem xét tất cả các bản cập nhật hotfix/bảo mật cho VS2008 trên hộp. là

Cuối cùng, tôi đưa dự án trên một máy khác nhau mà chưa được cập nhật trong 2-3 tuần vừa qua. Nó hoạt động tìm thấy trên đó, và nó có các bản cập nhật VS tương tự được cài đặt.

Tôi cũng đã thay đổi mã đang được thực hiện cho mục đích của bài đăng này. .. Nó là một số nguyên đơn giản, không có MFC liên quan.

Hiện tại tôi đang ở giữa quá trình cài đặt lại VS2008.

+0

Bạn đã liên kết Control (nói IDC_BUTTON1) như ON_BN_CLICKED (IDC2_BUTTON1, OnBnClcikedCutton1)? Nó có thể là một vấn đề. – Sunscreen

+0

Có. Đó là làm thế nào nó được đến breakpoint, nếu tôi hiểu câu hỏi của bạn. – HotOil

+0

Trong code của bạn, ở đâu đó vào lúc bắt đầu, bạn phải liên kết Control của hộp thoại của bạn với chức năng rlated: BEGIN_MESSAGE_MAP (CTestProjectDlg, CDialog) ... ON_BN_CLICKED (IDC2_BUTTON1, OnBnClcikedCutton1) Bạn có thể tìm kiếm trên mã cpp của bạn cho "ON_BN_CLICKED"? Có phải không? – Sunscreen

Trả lời

1

Bạn nói cùng một dự án biên dịch và chạy tốt trên một máy khác với cùng một phiên bản của Visual Studio. Mã có vẻ tốt, vì vậy, có vẻ như VS 2008 bị hỏng và cần được cài đặt lại.

+0

Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi. Gỡ cài đặt mọi thứ w/VS2008 trong tên. Sau đó cài đặt lại. Đã xảy ra sự cố. Bây giờ cài đặt lại SP1. Ước gì tôi biết nguyên nhân gây ra nó. Chưa có PC này trong 2 tuần. Tôi sợ nhóm CNTT có thể đã "vá" vấn đề này cho tôi. Không biết chính xác những gì để tránh để ngăn chặn nó xảy ra một lần nữa .. – HotOil

0

Nếu nó hoạt động trong bản phát hành nhưng không gỡ lỗi thì tôi cho rằng bạn có biến chưa được khởi tạo ở đâu đó. Trong gỡ lỗi nó được tự động thiết lập để 0xcdcdcdcd (hoặc một phần phụ của nó tùy thuộc vào kích thước biến) mà nguyên nhân bạn thất bại trong Release bạn có bất cứ giá trị trong bộ nhớ đã có và có lẽ giá trị đó ngăn nó phá vỡ ... Khá thường xuyên uninitialised biến như thế này được sử dụng như là một vòng lặp ràng buộc và trong debug bạn viết thông qua bộ nhớ và ghi đè lên một cái gì đó quan trọng mà có thể LATER gây ra một thất bại. Trong bản phát hành giá trị chỉ xảy ra là OK nhưng nó có thể không phải lúc nào cũng đúng.

Để gỡ lỗi trong bản phát hành, đừng lo lắng rằng giá trị này có vẻ như là rỗng. Nó có lẽ không phải là nhưng nó rất khó cho trình gỡ lỗi để nói chính xác nơi bạn đang ở trong mã do quá trình tối ưu hóa.

+0

Đó có thể là trường hợp .. nhưng * I * không có biến !! Đây là một ứng dụng hộp thoại một chức năng được tạo ra bởi VS2008. Điều duy nhất tôi đã thêm là trình xử lý nút. Lỗi xảy ra CHỈ khi bước qua dòng mã tiếp theo. Không làm điều đó, không có ngoại lệ nào được tạo ra. – HotOil

0

Điều thông minh cần làm là (counter-intuitively) chuck tất cả các điểm ngắt và như vậy. Xây dựng lại dự án của bạn (không phải là xây dựng gia tăng). Điều quan trọng là để bắt đầu từ một slate sạch, lấy ngoại lệ, và nhận được một cuộc gọi sạch sẽ ngăn xếp và chắc chắn rằng xây dựng là chính xác của các tập tin nguồn. Bạn cũng nên vô hiệu hóa các tiêu đề đã được biên dịch trước và như vậy.

1

Tôi cũng đang gặp phải điều tương tự, một lần nữa trên nền tảng phát triển Win7x64, VS2008 SP1. Mã của tôi là C++, WTL, ATL, DirectShow và nhiều thư viện khác.

Nhật ký cập nhật Windows cho thấy có bản cập nhật cửa sổ trên máy của tôi vào giờ ăn trưa. Vấn đề chỉ bắt đầu xảy ra sau giờ ăn trưa - không có thay đổi dự án!

Bạn và bản cập nhật tự động ngu ngốc của bạn phá vỡ môi trường phát triển m $ !!! Xấu hổ về y'all!

6

Có cùng vấn đề với VS2008 SP1, Win7x64, gỡ lỗi mã trong 32 bit. Sự cố sẽ biến mất nếu tôi tắt tùy chọn

Công cụ -> Tùy chọn -> Gỡ lỗi -> Gốc -> Bật gỡ rối RPC.

Các mục sau đây có thể liên quan đến điều này: Debugging commands (step over/into) cause unhandled exceptions

+0

Tôi chỉ có một máy mới, x64, và đã có một lỗi khó chịu nộp cho tôi từ cũ, tổng mã từ lứa tuổi trước đây, mà tôi đã sửa chữa một vài lỗi một năm trước. Biên soạn nó, có ngoại lệ trông đáng sợ, tôi cho rằng chúng có liên quan đến lỗi. Mất cả buổi sáng để nhận ra rằng, không, nó chỉ xảy ra trong khi tôi đang cố gắng để gỡ lỗi, và chỉ khi tôi đặt một breakpoint một nơi nào đó. Sửa chữa của bạn hoạt động hoàn hảo: sự tỉnh táo của tôi được khôi phục! (Tôi vẫn còn có lỗi để sửa chữa, nhưng tôi chỉ vui vì nó không phải là một vi phạm truy cập ở những nơi ngẫu nhiên mà không nên có ném vi phạm truy cập ...) – neminem

+1

Cảm ơn bạn cho câu trả lời này, tôi chỉ cần chạy vào này vấn đề và tìm kiếm ở đây, điều này cố định nó cho tôi ngay lập tức (bằng cách sử dụng Visual Studio 2010). –

+0

Tôi nghĩ đây là câu trả lời; nó bây giờ đã khắc phục vấn đề cho tôi trên 5 máy. Nó sẽ giải thích lý do tại sao cài đặt lại làm việc cũng như tùy chọn này không được bật theo mặc định. – thomasmichaelwallace

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