2009-11-01 26 views
6

Im sử dụng ứng dụng VS2008 và My MFC đã bắt đầu đổ vỡ khi thiết lập điểm ngắt hoặc chạy đến con trỏ. Tôi nhận được rất nhiều lỗi như thế này: -Không thể theo dõi vi phạm truy cập 0xC00000FD

First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 

Cuộc gọi chồng là không có nhiều trái hoặc nó chỉ liệt kê mã trong NT.dll

> 00000000() 
    ntdll.dll!7c9032a8()  
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!7c90327a()  
    ntdll.dll!7c92aa0f()  
    ntdll.dll!7c90e48a()  
    ntdll.dll!7c9032a8()  

Tôi không thể tìm ra vấn đề sử dụng điểm break hoặc bước qua mã của tôi. Ứng dụng "có vẻ" chạy bình thường nếu chạy bằng F5 trong VS.

Làm cách nào tốt nhất để theo dõi sự cố này?

+0

Bạn đã thử bật tất cả ngoại lệ trong VS chưa? Tuy nhiên nó không bắt được nó? – Naveen

+0

Có nhưng sau khi làm điều đó tôi nhận được một ngoại lệ khác mà tôi đã truy trở lại ngay sau khi domodal ban đầu được gọi. Ứng dụng của tôi là dựa trên trình hướng dẫn. Whne tôi làm cho phép tất cả các trường hợp ngoại lệ nhận được vấn đề ban đầu như được đăng. – Paul

+0

Rightclick stackframes của bạn và tải các biểu tượng cho ntdll. Sẽ không giải quyết bất cứ điều gì, nhưng nhiều thông tin không thể làm tổn thương. – sisve

Trả lời

5

Đâu là tràn ngăn xếp từ tiêu đề câu hỏi của bạn? Vi phạm truy cập thường chỉ ra một tham số con trỏ không hợp lệ.

Sử dụng lịch sử sửa đổi của bạn để tìm phiên bản đầu tiên nơi mọi thứ bắt đầu bùng nổ, sau đó phân tích tất cả các công cụ con trỏ đang diễn ra trong và xung quanh mã được sửa đổi trong bản sửa đổi đó.

+0

Typo phải là vi phạm quyền truy cập trong tiêu đề. Tôi có thể làm và nghĩ về điều đó nhưng ứng dụng có nhiều tháng làm việc đi vào nó ở giai đoạn này. Tôi đã hy vọng sẽ có một cách nhanh hơn nhưng nếu không thì đủ công bằng. – Paul

+0

Nếu nó có nhiều tháng làm việc đi vào nó, bạn đang sử dụng một số hệ thống kiểm soát nguồn, phải không? Nếu không, hãy bắt đầu làm điều đó * ngay bây giờ *. Nghiêm túc. – Thomas

+0

Có. Tôi đã sử dụng TortoiseSVN kể từ khi bắt đầu. – Paul

0

Visual Studio có tùy chọn ở đâu đó để phá vỡ ngoại lệ cơ hội đầu tiên (không nhớ chính xác vị trí của nó, có thể là mục menu ngoại lệ trong trình đơn phụ gỡ rối?) Bạn muốn bật tính năng này và xem cuộc gọi ngăn xếp thời điểm chúng xảy ra.

Ngoài ra còn có tùy chọn bật Microsoft Symbol Server, điều này sẽ tự động tải xuống các biểu tượng phù hợp cho bất kỳ dll hệ thống nào bạn thấy trong ngăn xếp. (xin lỗi, không nhớ chính xác cách thiết lập thats).

+0

Đó là dưới Debug | Ngoại lệ | Win32 ngoại lệ. Ngoại lệ trên trông lạ mắt quen thuộc với dereferencing con trỏ null. – MP24

2

Tôi sẽ sử dụng kỹ năng gỡ rối tâm linh của mình và cho bạn biết rằng bạn đang ghi đè bộ đệm nằm trong ngăn xếp - cụ thể là bạn đang viết quá nhiều số không vào bộ đệm không đủ lớn để giữ nó.

Bạn có các triệu chứng cổ điển của ngăn xếp bị hỏng - AV đầu tiên bạn nhấn đang cố truy cập bằng không trừ một vài byte - rõ ràng là bù đắp từ con trỏ ngăn xếp của bạn thành tham số hoặc biến cục bộ của bạn. (Tôi không bao giờ có thể nhớ cái nào ở trên con trỏ ngăn xếp và cái nào ở dưới.) Sau đó, bạn có một loạt các dòng chỉ ra con trỏ đã được đặt thành 0, thường xảy ra vì hàm trả về các địa chỉ trong các khung stack có được ghi đè bằng không giá trị - bởi vì bạn ghi đè bộ đệm dựa trên ngăn xếp và làm hỏng tất cả các nội dung quan trọng khác trên ngăn xếp. Khi chương trình của bạn cố gắng quay trở lại từ hàm hiện tại, nó sẽ tìm trong ngăn xếp để xem nó đến từ đâu, xem số 0 và nhảy ngay tại đó. Rất tiếc!

Vì ngăn xếp của bạn được chuyển vào thùng rác, bạn không thể tìm thấy dấu vết ngăn xếp quá hữu ích; khung ngăn xếp của bạn có thể bị hỏng bởi điểm này.

2

Có một số "mẫu" trên web mà một số sử dụng để làm các chương trình Windows của họ Thay vì điều này trong WndProc()

case WM_CLOSE: 
    PostQuitMessage(SUCCESS); 
    break; 
case WM_DESTROY: 
    DestroyWindow(hwnd); 
    break; 

Chúng tôi có được điều này:

case WM_CLOSE: 
    DestroyWindow(hwnd); 
    break; 
case WM_DESTROY: 
    PostQuitMessage(SUCCESS); 
    break; 

Nếu SUCCESS là 0, DestroyWindow() lấy một con trỏ rỗng tạo ra một ngoại lệ khi cửa sổ đóng.

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