2010-10-25 15 views
5

Tôi có một ứng dụng chỉ chạy tốt trong debug xây dựng, nhưng khi tôi bắt đầu nó trong việc phát hành xây dựng, tôi nhận được mộtphải làm gì nếu debug chạy tốt, nhưng phát hành bị treo

unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005: 
Access violation while reading at position 0x004bd96c 

Nếu tôi nhấp vào 'break' nó nói với tôi rằng không có biểu tượng nào được tải và mã nguồn không thể được hiển thị.

Tôi có thể làm gì trong tình huống như vậy để theo dõi sự cố?

+0

Điều này đôi khi xảy ra do sự cố bộ nhớ. Thường phát hành các bản xây dựng ít được tha thứ trong lĩnh vực này. Chương trình của bạn có thể có rò rỉ bộ nhớ, các vấn đề tràn bộ đệm, v.v ... không? – Cam

+0

loại sự cố bộ nhớ nào? – Mat

+1

Có vẻ như bạn đã xóa một cái gì đó, nhưng hãy thử sử dụng nó. Có anyway bạn thực sự có thể gửi một số mã? Chúng tôi không thể làm gì nếu bạn không nói cho chúng tôi biết bạn đang làm gì. – GManNickG

Trả lời

3

Nó có thể là hai điều:

  • Một hoặc nhiều khẳng định của bạn không làm việc cần thiết ngoài việc kiểm tra bản thân
  • Cái gì khác

Để loại trừ trước đây, cố gắng xác định lại assert dưới dạng một hoạt động trống trong bản dựng gỡ lỗi. Nếu sự vắng mặt của một số khẳng định gây ra sự cố, bạn sẽ thấy nó. Nếu không, nó là cái gì khác.

Ngoài ra, tôi cho rằng bạn có quyền kiểm soát phiên bản. Điều này chỉ mới bắt đầu xảy ra? Bạn có thể phân tích các thay đổi mã từ tuần trước.

Cuối cùng, ngay cả khi không có sự cố trong chế độ gỡ lỗi, việc chạy công cụ kiểm tra bộ nhớ có thể hữu ích để phát hiện truy cập bộ nhớ không đúng.

+0

+1 cho đề xuất kiểm soát phiên bản. – Zooba

+0

Tôi sử dụng kiểm soát phiên bản cho tất cả các dự án của tôi ngoại trừ một trong những máy này đặc biệt tôi đang phát triển không được kết nối với internet:/ngớ ngẩn tôi ... tôi xác định lại khẳng định không làm gì và nó không sụp đổ trong xây dựng gỡ lỗi. Tôi sẽ google 'công cụ kiểm tra bộ nhớ' - bạn có thể giới thiệu một công cụ này không? – Mat

+0

@Mat: Hãy xem xét gợi ý của @ Grozz về việc sử dụng đầu ra nhật ký. Điều này chắc chắn sẽ đặt một số ánh sáng vào nó. –

10

Loại sự cố này thường do các biến được phân chia theo đơn vị. Tôi sẽ bắt đầu tìm kiếm vấn đề của bạn.

Chế độ gỡ lỗi được tha thứ hơn vì nó thường được định cấu hình để khởi tạo các biến chưa được khởi tạo rõ ràng.

Có lẽ bạn đang xóa một con trỏ được đơn vị hóa. Trong chế độ gỡ lỗi nó hoạt động vì con trỏ đã được nulled và xóa ptr sẽ được ok trên NULL. Ngày phát hành nó là một số rác, sau đó xóa ptr thực sự sẽ gây ra một vấn đề.

+0

nghe có vẻ hợp lý! thế nào tôi có thể nói với Visual Studio không để khởi tạo các biến trong xây dựng gỡ lỗi? – Mat

+0

Tôi đã kích hoạt/RTCu (các biến không khởi tạo) trong bản dựng gỡ lỗi của tôi - không nên nag này nếu có bất kỳ biến chưa được khởi tạo nào? – Mat

+0

có trong hầu hết các trường hợp, tuy nhiên không phải trong mọi trường hợp. Nếu một con trỏ có thể đã được khởi tạo bằng các phương tiện khác, kiểm tra này sẽ bị bỏ qua. Trong thực tế, bạn có thể đã sử dụng address-of & operator và khởi tạo biến thông qua con trỏ. Vì vậy, nó vẫn có thể thiếu một khởi tạo và không tạo ra một cảnh báo. Xem http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx – Montdidier

1

Theo dõi vấn đề chèn đầu ra nhật ký ở đây và ở đó ngay từ đầu chức năng main.

1

Nếu đó không phải là vấn đề về bộ nhớ, bạn phải bật xác nhận trong bản phát hành. Đối với các vấn đề về bộ nhớ, tôi hy vọng bạn có các bài kiểm tra đơn vị tốt. Bạn có thể dễ dàng nắm bắt các vấn đề như vậy với valgrind.

btw tại sao mọi người vô hiệu hóa các xác nhận trong phiên bản phát hành? Trong 99% trường hợp, chúng không gây ra các vấn đề về hiệu năng, và tốt trong việc phát hiện lỗi.

0

Lấy một bãi chứa sự cố bằng cách sử dụng Microsoft debugdiag trên cửa sổ (miễn phí) và phân tích kết xuất bằng cách sử dụng giống nhau. Nó cung cấp một ngăn xếp cuộc gọi tốt đẹp cho các chức năng mà nó bị treo. Mặc dù, nếu nó tiếp tục rơi khắp nơi, nó có thể là một vấn đề tham nhũng đống. Sau đó, bạn cần phải sử dụng cờ toàn cầu (hoặc gflags là một phần của các công cụ microsoft để gỡ lỗi bộ đó là miễn phí) kết hợp với debugdiag. Gflags sẽ cung cấp cho bạn vị trí nơi heap thực sự bị hỏng. Hy vọng rằng sẽ giúp.

0

Nếu không nhìn vào mã, thật khó để nói điều gì là xấu. Tất cả các đề xuất trên là tốt và hữu ích nhưng những gì tôi đã tìm thấy hữu ích nhất sửa chữa loại điều này là để chạy một số phần của chương trình trong khối. tức là, nhận xét rất nhiều mã/chức năng và sau đó chạy chương trình và xem liệu nó có bị treo hay không. Nếu không, hãy bỏ ghi chú một số chức năng và sau đó chạy lại, v.v. Bằng cách này, bạn sẽ có thể thu hẹp vấn đề xuống mã chính xác đang gây ra lỗi này.

Trong hầu hết các trường hợp, điều này xảy ra do một số lỗi tràn bộ đệm mà bản dựng Debug có thể bảo vệ chống lại.

2

Hai bước sau:

a) phát hành xây dựng xây dựng với debug ký hiệu (có thể với VS ít nhất)

b) xây dựng phát hành xây dựng mà không tối ưu hóa

Nếu vấn đề vẫn xảy ra, nó rất tốt và dễ sửa. Đó là almsot như thể vấn đề là trong xây dựng gỡ lỗi.

Nếu sự cố xảy ra với cài đặt tối ưu hóa, thì điều đó thực sự khó khăn và phải được xử lý theo cách cụ thể về tình hình.

+0

nếu tôi xây dựng bản phát hành có biểu tượng gỡ lỗi, nó không bị lỗi – Mat

+0

@Mat: đó là _very_ lạ, như nhị phân nên (cho tất cả các mục đích) giống hệt nhau. Sự khác biệt chính là tùy chọn "các biểu tượng gỡ lỗi" tạo một tệp .PDB riêng biệt mô tả mối quan hệ giữa các địa chỉ bộ nhớ và các hàm/biến. I E. sẽ cho bạn biết địa chỉ là gì tại địa chỉ '0x0043b134' hoặc địa chỉ' 0x004bd96c'. – MSalters

+0

@MSalters: Tôi nghĩ lý do là các tệp nhị phân phát hành luôn được xây dựng với một số tối ưu hóa (/ O2 ví dụ). Tôi nghi ngờ nó đã có để làm với cờ tối ưu hóa. – Chubsdad

1

Tôi đã gặp sự cố này, phát hành/gỡ lỗi hoạt động tốt bên trong studio trực quan, gỡ lỗi công việc độc lập, nhưng bản phát hành bị lỗi độc lập. Gỡ lỗi không đặc biệt chính xác đối với tôi, giải pháp của tôi là:

Nhận xét hầu hết mã, sau đó tạo, kiểm tra, bỏ ghi chú, lặp lại, cho đến khi bạn tìm thấy phần gây ra sự cố.

Trong trường hợp của tôi, nó chuyển một con trỏ tới một mảng quá nhỏ so với hàm.

1

Bạn có chắc chắn rằng cả hai bản phát hành đều sử dụng cùng một .dll? Tôi dành một giờ tự hỏi tại sao chương trình của tôi đã biên dịch trong chế độ gỡ lỗi nhưng không ở chế độ phát hành và tôi chỉ quên cập nhật dll trong thư mục phát hành.

0

Đối với tôi, vấn đề là một nhà xây dựng đã khởi tạo 2 biến thành viên theo thứ tự sai. tức là không giống với thứ tự mà chúng được khai báo.
Tôi ngạc nhiên rằng thứ tự khởi tạo thực sự tạo ra bất kỳ sự khác biệt nào.

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