Tệp PDB là gì?


252

Tệp PDB là gì và làm cách nào tôi có thể loại trừ nó khỏi thư mục phát hành khi tôi xây dựng lại giải pháp của mình?


17
pdb là một tệp cơ sở dữ liệu chương trình và nó được tạo khi biên dịch. Tệp này chứa thông tin trạng thái gỡ lỗi và dự án cho phép liên kết gia tăng cấu hình gỡ lỗi của chương trình của bạn.
pavanred

@pavanred bạn có chắc trình biên dịch C # cũng không liên kết gia tăng không? Tôi chỉ nghe nói về nó trong thế giới C ++. Trong dự án C ++, bạn bật / tắt liên kết gia tăng từ các thuộc tính của dự án. Có một tùy chọn trong dự án C # không?
RBT

Câu trả lời:


236

Tệp PDB chứa thông tin để trình gỡ lỗi hoạt động. Có ít thông tin hơn trong bản dựng Phát hành so với bản dựng Debug. Nhưng nếu bạn muốn nó hoàn toàn không được tạo, hãy chuyển đến thuộc tính Build của dự án, chọn cấu hình Phát hành, nhấp vào "Nâng cao ..." và trong "Thông tin gỡ lỗi" chọn "Không".


2
@Jon Nó có giúp cung cấp thêm thông tin cho người dùng nếu ứng dụng gặp sự cố không? (nghĩa là, nó có giúp với cửa sổ JIT không, thay vì "Chương trình này cần kết thúc, gửi Báo cáo Lỗi Windows")
Jared Harley

19
Hãy nhớ rằng bạn có thể nên giữ những thứ này trong các bản phát hành gỡ lỗi của mình, vì nó cho phép các ngoại lệ được truy tìm đến một dòng cụ thể trong mã của bạn. Không có các ký hiệu trong tệp pdb, bạn sẽ khó xác định được các vấn đề cụ thể để giải quyết chúng. Bạn không nhất thiết phải loại trừ chúng khỏi các bản phát hành, vì đôi khi thông tin bổ sung trong một báo cáo lớn có thể rất hữu ích.
Darbio

4
@Jared: Có, nó bao gồm một dấu vết ngăn xếp của ngoại lệ, sẽ xác định chính xác đến một chức năng và dòng mã cụ thể.
Darbio

1
@Jared: Ý bạn là gì khi "cửa sổ JIT"? Không thể cung cấp nhiều thông tin hơn cho người dùng, nhưng nó có thể cho phép bạn đính kèm trình gỡ lỗi vào bản dựng phát hành nếu bạn cần. Thông thường, bạn sẽ không bao gồm nó cho các ứng dụng người dùng cuối mặc dù. Tất nhiên, chỉ vì nó được sao chép vào thư mục Phát hành không có nghĩa là bạn phải gửi nó trong trình cài đặt ...
Jon Skeet

3
@Ata: PDB, không phải PDF. Vui lòng phân tách hai thứ trong tâm trí của bạn - chúng là các định dạng tệp hoàn toàn khác nhau, cho các mục đích khác nhau. Bao gồm một PDB sẽ không giới thiệu một vấn đề đặc biệt; nó có thể làm cho công việc của hacker trở nên dễ dàng hơn một chút , nhưng đó có phải là mối quan tâm đặc biệt đối với bạn không? Nói chung, .NET có thể được dịch ngược tương đối dễ dàng trong hầu hết các trường hợp - nếu bạn lo lắng về điều đó, đơn giản là không vận chuyển PDB không phải là một giải pháp tốt.
Jon Skeet

130

Ban đầu tôi đã tự hỏi mình câu hỏi " Tôi có cần tệp PDB được triển khai cho máy của khách hàng không? " Và sau khi đọc bài đăng này, đã quyết định loại trừ tệp.

Mọi thứ đều hoạt động tốt, cho đến hôm nay, khi tôi đang cố gắng tìm ra lý do tại sao một hộp thông báo chứa một thông tin Exception.StackTracebị thiếu tệp và số dòng - cần thiết để khắc phục ngoại lệ. Tôi đã đọc lại bài đăng này và tìm thấy một thông tin chính: mặc dù PDB không cần thiết để ứng dụng chạy, nhưng cần phải có tệp và số dòng trong StackTracechuỗi. Tôi đã bao gồm tệp PDB trong thư mục thực thi và bây giờ tất cả đều ổn.


2
Đây là một phần rất quan trọng cần ghi nhớ mà accepted answerở đây không đề cập đến.
Monku

85

PDB là tên viết tắt của P rogram D ata B ase. Như tên cho thấy, nó là một kho lưu trữ (lưu trữ liên tục như cơ sở dữ liệu) để duy trì thông tin cần thiết để chạy chương trình của bạn ở chế độ gỡ lỗi. Nó chứa nhiều thông tin quan trọng cần thiết trong khi bạn gỡ lỗi mã của mình (trong Visual Studio), ví dụ như tại điểm bạn đã chèn các điểm ngắt mà bạn mong muốn trình gỡ lỗi phá vỡ trong Visual Studio.

Đây là lý do tại sao nhiều lần Visual Studio không đạt được điểm dừng nếu bạn xóa các *.pdbtệp khỏi thư mục gỡ lỗi của mình. Trình gỡ lỗi Visual Studio cũng có thể cho bạn biết số dòng mã chính xác mà tại đó một ngoại lệ xảy ra trong dấu vết ngăn xếp với sự trợ giúp của *.pdbcác tệp. Vì vậy, các tệp pdb hiệu quả thực sự là một lợi ích cho các nhà phát triển trong khi gỡ lỗi một chương trình.

Nói chung, không nên loại trừ việc tạo các *.pdbtệp. Từ quan điểm phát hành sản xuất, điều bạn nên làm là tạo các tệp pdb nhưng không gửi chúng đến trang web của khách hàng trong trình cài đặt sản phẩm. Bảo toàn tất cả các tệp PDB được tạo trên một máy chủ ký hiệu từ đó có thể được sử dụng / tham chiếu trong tương lai nếu được yêu cầu. Đặc biệt cho các trường hợp khi bạn gỡ lỗi các vấn đề như sự cố quá trình. Khi bạn bắt đầu phân tích các tệp kết xuất sự cố và nếu các *.pdbtệp gốc của bạn được tạo trong quá trình xây dựng không được bảo tồn thì Visual Studio sẽ không thể tạo ra dòng mã chính xác gây ra sự cố .

Nếu bạn vẫn muốn vô hiệu hóa việc tạo các *.pdbtệp hoàn toàn cho bất kỳ bản phát hành nào, hãy chuyển đến các thuộc tính của dự án -> Tab Build -> Nhấp vào Advancednút -> Chọn nonetừ hộp thả xuống "Thông tin gỡ lỗi" -> nhấn OKnhư hiển thị trong ảnh chụp bên dưới .

Không có cài đặt Thông tin gỡ lỗi cho Dự án C #

Lưu ý : Cài đặt này sẽ phải được thực hiện riêng cho cấu hình bản dựng "Gỡ lỗi" và "Phát hành".


13

Một tệp PDB chứa thông tin được sử dụng bởi trình gỡ lỗi. Không bắt buộc phải chạy ứng dụng của bạn và không cần đưa vào phiên bản phát hành của bạn.

Bạn có thể vô hiệu hóa các tệp pdb được tạo trong Visual Studio. Nếu bạn đang xây dựng từ dòng lệnh hoặc tập lệnh thì bỏ qua công /Debugtắc.


2
Chế độ phát hành vẫn xây dựng PDB theo mặc định, tôi tin. Bạn có thể thay đổi các thuộc tính dự án để vô hiệu hóa nó mặc dù.
Jon Skeet

Yup; nó vẫn đi kèm với phát hành với một dự án mặc định.
Andrew Barber

Tôi chỉ kiểm tra và tôi cũng nhận được một mặc định nếu sử dụng Visual Studio.
Mark Byers

4

Tệp cơ sở dữ liệu gỡ lỗi chương trình (pdb) là định dạng tệp của Microsoft để lưu trữ thông tin gỡ lỗi.

Khi bạn xây dựng một dự án bằng Visual Studio hoặc dấu nhắc lệnh, trình biên dịch sẽ tạo các tệp ký hiệu này.

Kiểm tra tài liệu Microsoft

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.