2008-08-30 16 views
12

Có cài đặt VC++ nào mà tôi nên biết để tạo các tệp PDB tốt hơn có chứa nhiều thông tin hơn không?Bất kỳ cài đặt VC++ nào được đề xuất để phân tích PDB tốt hơn trên bản phát hành

Tôi có hệ thống phân tích đổ đổ tại chỗ dựa trên dự án crashrpt.

Ngoài ra, máy chủ xây dựng sản xuất của tôi có mã nguồn được cài đặt trên D: \, nhưng máy phát triển của tôi có mã nguồn trên C: \. Tôi đã nhập đường dẫn nguồn trong cài đặt VC++, nhưng khi xem qua ngăn xếp cuộc gọi của sự cố, nó không tự động chuyển đến mã nguồn của tôi. Tôi tin rằng nếu tôi có mã nguồn của máy dev của tôi trên D: \ nó sẽ hoạt động.

Trả lời

5

"Có bất kỳ cài đặt VC++ tôi nên biết về"

Hãy chắc chắn rằng bạn tắt con trỏ Khung ommision. Blog của Larry osterman có the historical details về fpo và các vấn đề mà nó gây ra khi gỡ lỗi.

Ký hiệu được tải thành công. Nó cho thấy các callstack, nhưng nhấp đúp vào một mục không mang lại cho tôi mã nguồn.

Bạn đang sử dụng phiên bản VS nào? (Hoặc là bạn đang sử dụng Windbg?) ... trong VS nó nên defintely nhắc nguồn cho lần đầu tiên nếu nó không tìm thấy vị trí. Tuy nhiên nó cũng giữ một danh sách các nguồn đó là 'không tìm thấy' vì vậy nó không yêu cầu bạn cho nó mỗi lần. Đôi khi danh sách không nhìn là một nỗi đau ... để có được lời nhắc sao lưu, bạn cần phải đi đến giải pháp thám hiểm/giải pháp nút/thuộc tính/gỡ lỗi tài sản và chỉnh sửa danh sách tập tin trong ngăn dưới.

Cuối cùng, bạn có thể đang sử dụng 'biểu tượng bị tước'. Đây là những tập tin pdb được tạo ra để cung cấp thông tin gỡ lỗi cho việc đi bộ callstack qua FPO, nhưng với các vị trí nguồn bị loại bỏ (cùng với các dữ liệu khác). Các biểu tượng công cộng cho các thành phần hệ điều hành windows bị tước pdbs. Đối với mã của riêng bạn chỉ đơn giản là gây ra đau đớn và không có giá trị nó, trừ khi bạn đang cung cấp pdbs của bạn để externals. Làm thế nào bạn sẽ có một trong những pdbs tước khủng khiếp? Bạn có thể có chúng nếu bạn sử dụng "binplace" với lệnh -a.

Chúc may mắn! Một câu chuyện kết xuất nhỏ phù hợp là một điều tuyệt vời để gỡ lỗi sản xuất.

1

Bạn có thể thử sử dụng lệnh MS-DOS subst để gán thư mục mã nguồn của bạn cho ổ D :.

0

Trong trường hợp bất cứ ai quan tâm đến, một đồng nghiệp trả lời cho câu hỏi này với tôi qua email:

Artem đã viết:

Có một lá cờ để MiniDumpWriteDump() có thể làm sụp đổ tốt hơn bãi mà sẽ cho phép nhìn thấy trạng thái chương trình đầy đủ, với tất cả các biến toàn cầu, vv đối với ngăn xếp cuộc gọi, tôi nghi ngờ họ có thể tốt hơn vì tối ưu hóa ... trừ khi bạn bật (có thể một số) optimizatio ns tắt.

Ngoài ra, tôi nghĩ rằng vô hiệu hóa các chức năng nội tuyến và toàn bộ chương trình tối ưu hóa sẽ giúp ích rất nhiều.

Trong thực tế, có rất nhiều loại bãi, có lẽ bạn có thể chọn một nhỏ đủ nhưng vẫn có biết thêm http://msdn.microsoft.com/en-us/library/ms680519(VS.85).aspx

Những loại sẽ không giúp với cuộc gọi stack tuy nhiên, họ chỉ ảnh hưởng đến số tiền trong số các biến số bạn sẽ có thể xem.

Tôi nhận thấy một số loại kết xuất này không được hỗ trợ trong phiên bản 5.dbghelp.dll mà chúng tôi sử dụng. Chúng tôi có thể cập nhật lên phiên bản mới nhất, 6.9 phiên bản mặc dù, tôi vừa kiểm tra EULA cho Công cụ gỡ lỗi MS - mới nhất dbghelp.dll vẫn còn ok để phân phối lại.

0

Visual Studio có nhắc bạn cho đường dẫn đến tệp nguồn không? Nếu nó không phải là sau đó nó không nghĩ rằng nó có biểu tượng cho callstack. Đặt đường dẫn nguồn sẽ hoạt động mà không cần phải lập bản đồ vị trí gốc chính xác.

Bạn có thể biết biểu tượng có được tải hay không bằng cách xem cửa sổ 'mô-đun' trong Visual Studio.

Giả sử bạn đang xây dựng một PDB thì tôi không nghĩ có bất kỳ tùy chọn nào kiểm soát lượng thông tin trong PDB trực tiếp. Bạn có thể thay đổi kiểu tối ưu hóa được thực hiện bởi trình biên dịch để cải thiện khả năng debuggabilty, nhưng điều này sẽ làm giảm hiệu suất - như đồng nghiệp của bạn chỉ ra, vô hiệu hóa nội tuyến sẽ giúp mọi thứ hiển nhiên hơn trong tệp tin lỗi, nhưng sẽ tốn thời gian.

Tùy thuộc vào bản chất của ứng dụng, tôi khuyên bạn nên làm việc với các tệp kết xuất đầy đủ nếu bạn có thể, chúng lớn hơn, nhưng cung cấp cho bạn tất cả thông tin về quy trình ... và sự cố thường xuyên như thế nào :)

0

Visual Studio có nhắc bạn cho đường dẫn vào tệp nguồn không?

số

Nếu nó không phải là sau đó nó không nghĩ nó có những biểu tượng cho callstack. Đặt đường dẫn nguồn sẽ hoạt động mà không cần phải bản đồ vị trí ban đầu chính xác.

Ký hiệu được tải thành công. Nó cho thấy các callstack, nhưng nhấp đúp vào một mục không mang lại cho tôi mã nguồn. Tôi có thể tìm kiếm Tất nhiên trong các tập tin cho các dòng trong câu hỏi, nhưng đây là công việc khó khăn :)

2

Nếu bản dựng của bạn trực tiếp từ hệ thống quản lý mã nguồn của bạn, bạn nên chú thích tệp pdb của bạn với nguồn gốc của tệp. Điều này cho phép bạn tự động tìm nạp các tệp nguồn chính xác trong khi gỡ lỗi. (Đây là các nguyên tắc tương tự như được sử dụng để truy xuất mã nguồn khung net .Net).

Xem http://msdn.microsoft.com/en-us/magazine/cc163563.aspx để biết thêm thông tin. Nếu bạn sử dụng subversion như SCM của bạn, bạn có thể kiểm tra dự án SourceServerSharp.

1

Đây là thủ tục tôi sử dụng sau khi một số rắc rối tương tự như của bạn:

a) Sao chép vào máy chủ sản xuất tất cả các EXE & file DLL mà được xây dựng, mỗi với nó tương ứng PDB để cùng thư mục, bắt đầu và chờ đợi sự cố xảy ra.

b) Sao chép tất cả các tệp EXE, DLL & PDB vào máy phát triển (vào thư mục tạm thời) cùng với minidump (trong cùng một thư mục). Visual Studio được sử dụng để tải minidump từ thư mục đó.

Vì VS tìm thấy các tệp nguồn nơi chúng được biên soạn ban đầu, nên nó luôn có thể nhận dạng chúng và tải chúng một cách chính xác. Như với bạn, trong máy sản xuất ổ đĩa được sử dụng không phải là C :, nhưng trong máy phát triển nó được. hơn

Hai lời khuyên:

  • Một điều tôi đã làm thường là để sao chép một EXE/DLL xây dựng lại và quên để sao chép các PDB mới. Điều này hủy hoại chu trình gỡ lỗi, VS sẽ không thể hiển thị cho tôi ngăn xếp cuộc gọi.

  • Đôi khi, tôi nhận được một ngăn xếp cuộc gọi không có ý nghĩa trong VS. Sau một số cơn đau đầu, tôi phát hiện ra rằng windbg sẽ luôn cho tôi thấy đúng ngăn xếp, nhưng VS thường thì không. Không biết tại sao.

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