2010-02-15 26 views
14

'Các phương pháp hay nhất' khi nói đến gỡ lỗi các bãi lõi bằng GDB là gì?Gỡ lỗi trong Linux bằng cách sử dụng các bãi lõi

Hiện nay, tôi đang phải đối mặt với một vấn đề:

  • Phiên bản phát hành ứng dụng của tôi được biên dịch mà không có sự '-g' biên dịch cờ.
  • Phiên bản gỡ lỗi của ứng dụng của tôi (được biên dịch bằng '-g') được lưu trữ (cùng với mã nguồn và bản sao của bản phát hành nhị phân).

Gần đây, khi người dùng đã cho tôi một bãi chứa lõi, tôi đã cố gắng gỡ nó bằng cách sử

gdb --core=./core.pid ./my_app_debug-bin 

Cốt lõi được tạo ra bởi my_app_release-bin. Dường như có một số loại không phù hợp giữa tệp lõi và tệp nhị phân.

Mặt khác, nếu tôi cố gắng

gdb --core=./core.pid ./my_app_release-bin 

các trận đấu cốt lõi nhưng tôi không thể nhận được số dòng mã nguồn (mặc dù tôi nhận được tên hàm).

Đây có phải là những gì được thực hành không? Bởi vì tôi cảm thấy tôi đang thiếu cái gì đó ở đây.

+1

Gắn thẻ thêm tốt trong tiêu đề câu hỏi, ý tôi là không giống như SO đã gắn thẻ gắn sẵn ... –

Trả lời

16

Có vẻ như có sự khác biệt khác giữa bản phát hành và bản dựng gỡ lỗi của bạn, sau đó chỉ đơn giản là sự vắng mặt/sự hiện diện của cờ -g. Giả sử trường hợp đó, bạn không thể làm gì ngay bây giờ, nhưng bạn có thể điều chỉnh bản dựng của mình để xử lý tốt hơn:

Đây là những gì chúng tôi làm tại nơi làm việc của tôi.

  1. Gắn cờ -g khi tạo phiên bản phát hành.
  2. Lưu trữ phiên bản đó.
  3. chạy strip --strip-unneeded trên tệp nhị phân trước khi gửi cho khách hàng.

Bây giờ, khi chúng tôi gặp sự cố, chúng tôi có thể sử dụng phiên bản đã lưu trữ có biểu tượng để gỡ lỗi.

Một điều cần lưu ý là nếu phiên bản phát hành của bạn bao gồm tối ưu hóa, việc gỡ lỗi có thể khó khăn ngay cả với biểu tượng. Ví dụ, trình tối ưu hóa có thể sắp xếp lại mã của bạn vì vậy ngay cả khi trình gỡ rối sẽ nói rằng bạn đã gặp lỗi trên dòng N, bạn không thể giả định rằng mã thực sự được thực hiện dòng N-1.

+0

Hey Samuel, Đây là cách đi đúng đắn, tôi nghĩ vậy. Ngay cả @Michael cũng chỉ ra một giải pháp tương tự. Tuy nhiên, các tệp nhị phân gỡ lỗi/phát hành chỉ có sự khác biệt của -g. Ngoài ra còn có các macro _DEBUG (để gỡ lỗi) và NDEBUG (để phát hành). Có thể điều đó đang gây ra vấn đề? Dù sao, tôi có kế hoạch khám phá các tệp nhị phân bị tước đi một chút nữa. Cảm ơn! – themoondothshine

+0

BTW, bạn có biết gì về công cụ 'addr2line' không? Tôi tìm thấy tài liệu tham khảo tối nghĩa cho nó. Nó được cho là có khả năng chuyển đổi địa chỉ thành số dòng cho mã nguồn. Tôi đã có các địa chỉ hàm, tất cả những gì tôi cần là ánh xạ tới mã nguồn ... – themoondothshine

+0

@themoondothshine: GDB có thể làm điều này cho bạn (miễn là nó có các biểu tượng gỡ lỗi), sử dụng 'dòng thông tin * 0xsomeaddr' – Hasturkun

1

Không, bạn không bỏ lỡ bất cứ điều gì. gỡ lỗi và phát hành chỉ là các tệp nhị phân khác nhau, do đó các tệp lõi của bản phát hành không khớp với nhị phân gỡ lỗi. Bạn phải nhìn vào mã máy để có được một cái gì đó từ bãi chứa lõi phát hành.

Bạn có thể phải hỏi người dùng về sự cố xảy ra và thu thập thông tin nhật ký bổ sung hoặc bất kỳ ứng dụng nào bạn tạo ra.

+0

Hey nodan, Tôi đã đăng nhập khá nhiều thông tin trong ứng dụng, nhưng đôi khi nó có thể không đủ. Người dùng thường không biết nguyên nhân gây ra sự cố do nó chạy dưới dạng nền. Tôi cũng có thêm thông tin về công cụ 'addr2line'. Tôi nghĩ tôi sẽ thử cái đó. – themoondothshine

5

Bạn cần thực hiện một số nội dung bổ sung để tạo các tệp nhị phân với thông tin gỡ lỗi đã tước mà sau đó bạn có thể gỡ lỗi từ lõi. Mô tả tốt nhất tôi có thể tìm thấy là here

+0

Hey Michael, Cảm ơn bạn đã liên kết. Nó thực sự hữu ích. – themoondothshine

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