2011-01-13 27 views
8

Tôi có một chương trình mà tôi dự định phân phối cho người dùng cuối và muốn nhận được báo cáo sự cố từ họ. Nếu tôi đang sử dụng MSVC, tôi sẽ tạo ra minidumps và có những người gửi đến cho tôi, và sau đó kiểm tra chúng với PDB tương ứng để có được một dấu vết stack hữu ích, ít nhất là.GCC tương đương với PDBs

Tương đương với việc này với GCC là gì? Tôi có thể tạo ra một dấu vết ngăn xếp, nhưng nếu tôi muốn điều này là hữu ích, nó đòi hỏi phải có các biểu tượng gỡ lỗi được biên dịch thành tệp thực thi (với -g). Rõ ràng điều này là không thể chấp nhận đối với bản phát hành bản phát hành, vì tệp thực thi có thể có kích thước lớn hơn một chút.

Tôi googled một chút và tìm thấy tham chiếu đến objcopy có thể tách riêng các biểu tượng gỡ lỗi thành một tệp riêng biệt, nhưng trang đó ngụ ý tôi vẫn cần phải có các biểu tượng gỡ lỗi cùng với bản phát hành có thể phát hành.

Trả lời

5

Tôi không thể tìm thấy câu trả lời chính xác cho điều này, nhưng tôi đã tìm thấy giải pháp thay thế hoạt động tốt: Biên dịch với tối ưu hóa và các cờ phát hành khác cùng với -g, lưu trữ kết quả thực thi ở đâu đó, sau đó xóa biểu tượng gỡ lỗi bằng dải . Gửi tệp thực thi bị tước bỏ và khi bạn nhận được dấu vết ngăn xếp, hãy sử dụng addr2line kết hợp với tệp thực thi gốc, chưa được thực thi và bạn sẽ nhận được tất cả các ký hiệu trở lại.

6

Vâng ý tưởng là bạn biên dịch với -g để thêm các biểu tượng gỡ lỗi nhưng không làm chậm chương trình xuống, ví dụ: hầu hết các chương trình sẽ thực hiện -g -O2, sau đó bạn có thể tách riêng các biểu tượng gỡ lỗi bằng objdump. Sau đó, bạn có thể strip bản xây dựng bản phát hành của mình để nó không có bất kỳ biểu tượng gỡ lỗi nào.

Cập nhật: gdb gần đây hỗ trợ các file debug riêng biệt, xem https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

Ví dụ bạn có thể doo

objcopy --only-keep-debug prog prog.debug 
strip prog 

Bây giờ prog sẽ không có bất kỳ biểu tượng gỡ lỗi của bạn. Nhưng bạn có thể sử dụng tệp proc.debug để gỡ lỗi trong gdb.

+0

Điều đó tốt và tốt đẹp, nhưng làm cách nào để điều chỉnh theo dõi ngăn xếp được tạo mà không có biểu tượng gỡ lỗi (và do đó chỉ chứa địa chỉ) với các biểu tượng gỡ lỗi được tách riêng sau đó. – pjohansson

+0

gdb có thể đặt để sử dụng các biểu tượng gỡ lỗi riêng biệt, đây là cách các bản phân phối Linux cho phép gỡ lỗi, xem http://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html – ismail

+2

Trang này dường như cũng giả định rằng thông tin gỡ lỗi có mặt trên máy tính có lỗi xảy ra. Tôi sẽ làm rõ: chúng tôi không thể gửi thông tin gỡ lỗi cho khách hàng của mình. Nó phải có khả năng cho phần mềm tạo ra một dấu vết ngăn xếp (không có các biểu tượng gỡ lỗi) và theo dõi ngăn xếp này được đối chiếu với các biểu tượng gỡ lỗi riêng biệt trên một trong các máy tính phát triển của chúng tôi ở giai đoạn sau, mà không cần sự tham gia của khách hàng. Tôi có lẽ cũng nên làm rõ rằng đây là một môi trường Windows, không phải là một * nix một. – pjohansson

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