2013-02-18 20 views
7

Tôi đang sử dụng lệnh CMAKE để cài đặt các tệp PDB để cho phép gỡ lỗi trong bản phân phối nhà phát triển ứng dụng C++ của tôi. Lệnh như sau:Các tệp PDB có cài đặt cmake

INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug 
    DESTINATION bin 
    FILES_MATCHING 
    PATTERN *.pdb 
) 

Ngoài ra, tôi đã quản lý để cài đặt các mã nguồn có liên quan dùng để xây dựng mà phân phối phát triển, trong một thư mục 'src' cùng cấp, do đó cấp cao nhất của tôi vẻ thư mục phân phối như:

include\ 
src\ 
lib\ 
bin\ 
share\ 
doc\ 
3rdparty\ 
etc\ 

Câu hỏi của tôi là làm cách nào để cho tệp PDB biết 'nguồn' là gì (tôi cho rằng đây là bắt buộc)? Có một lệnh CMAKE có thể đạt được điều này? Đánh giá cao một ví dụ nhỏ nếu bạn có nó. Cảm ơn thời gian và sự quan tâm của bạn.

+1

Bạn có thể xem [câu hỏi này] (http://stackoverflow.com/questions/27952/how-do-i-change-the-locations-of-source-files-in -a-symbols-file-pdb). – Angew

+0

Cảm ơn @Angew - Tôi đã đọc bài đăng và bài đăng từ liên kết trong đó. Tôi có thực sự phải trải qua tất cả các hoạt động kinh doanh máy chủ biểu tượng đó không? Tôi đoán những gì tôi yêu cầu là: là có một cách thông minh để đóng gói PDBs và nguồn phù hợp để tôi không phải làm bất cứ điều gì khác (dọc theo dòng của câu trả lời đầu tiên). –

+1

Tôi không có kinh nghiệm cá nhân với gỡ lỗi ngoài trang web, nhưng ấn tượng tôi nhận được từ tất cả những gì tôi đọc về việc di chuyển PDB xung quanh là bạn phải sử dụng 'subst' hoặc phản chiếu chính xác cây nguồn gốc.Tôi dự định một ngày nào đó sẽ điều tra vấn đề này từ sự tò mò; Thật không may, cho một số giá trị không rõ ràng * một ngày nào đó. * – Angew

Trả lời

4

Chuyển nhận xét của tôi thành câu trả lời; dựa chủ yếu vào thông tin từ số question này và các liên kết trong đó.

Tệp PDB lưu trữ tuyệt đối tên đường dẫn đến tệp nguồn. Khi không sử dụng một máy chủ biểu tượng, cách duy nhất để đảm bảo một số mức độ chuyển đổi mã nguồn là sử dụng lệnh subst.

Ý tưởng là sử dụng subst để tạo tên ổ đĩa (ví dụ: N:\) cho thư mục gốc của cây nguồn. Sau đó thực hiện các bản dựng của bạn từ ổ đĩa này, để các đường dẫn tuyệt đối bắt đầu bằng N:\ được nhúng vào các PDB. Khi bạn sau đó cần gỡ lỗi tệp thực thi trên một máy khác, hãy sử dụng subst trên máy đó để có cùng đường dẫn tuyệt đối với các nguồn. Điều này sẽ cho phép các PDB tìm các tệp nguồn.

Ví dụ, nếu bạn có một tập tin C:\MySources\main.cpp, làm như sau:

subst N: C:\MySources 
N: 
run your build 

Sau đó, chúng ta hãy nói rằng bạn cần phải gỡ lỗi trên một máy mà cùng một tập tin được lưu trữ trong D:\Devel\Other\main.cpp. Đơn giản chỉ cần làm subst N: D:\Devel\Other và sau đó làm việc từ N: lái xe đó là tốt.

0

Tệp pdb lưu trữ đường dẫn đến tệp như khi chương trình được biên soạn. Không có gì bạn phải làm để cho họ biết nguồn gốc .

+0

Bạn có chắc chắn về điều này? Ý tôi là, nếu một đường dẫn tuyệt đối mà tệp PDB lưu trữ (đường dẫn tuyệt đối tới nguồn), thì làm cách nào để xác định khi tôi đóng gói và gửi đi khi được sử dụng trên máy trạm của nhà phát triển khác? Nếu nó là tương đối, sau đó tôi nên chắc chắn rằng tôi cài đặt nguồn ở một vị trí đó là 'tương đối' giống với PDB khi nó được xây dựng? Tôi hy vọng tôi có ý nghĩa .. –

+0

Bạn luôn có thể kiểm tra điều này ... Visual Studio (và WinDBG) vừa đủ thông minh để ánh xạ cả vị trí của PDB và mã nguồn. VS sẽ tìm PDB trong cùng thư mục với mô-đun được nạp (hãy xem thẻ mô-đun trong trình gỡ lỗi). Bạn cũng có thể cho VS biết nơi cần xem qua Tùy chọn gỡ lỗi. Khi bạn nhấp vào một cuộc gọi ngăn xếp và nếu nguồn ở một vị trí khác, VS sẽ nhắc bạn về vị trí đó. Điều này thậm chí làm việc cho bãi đổ vỡ. Làm thế nào kém sẽ quy mô nếu tất cả chúng ta phải có chính xác bố trí cây nguồn giống nhau? –

1

Bạn chỉ cần thông báo cho studio trực quan nơi nguồn là .. nó sẽ bật lên hộp thoại trình duyệt tệp, chỉ trỏ đến nguồn trên máy cục bộ của bạn nếu đường dẫn khác với khi được xây dựng.

4

Tôi chỉ answered câu hỏi tương tự của riêng tôi How to get cmake to install pdb files for targets. Sử dụng quy tắc cài đặt này để sao chép tệp pdb của mục tiêu, nếu nó tồn tại, vào thư mục bin vị trí cài đặt của đích.

install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)