2009-09-21 27 views
11

Khi linux ứng dụng bị treo của tôi, nó tạo ra một dòng trong các bản ghi cái gì đó như:segfault rip/số RSP và là gì làm thế nào để sử dụng chúng

segfault tại 0000000 rip 00003f32a823 RSP 000123ade323 lỗi 4

là gì những địa chỉ rip và rsp đó? làm thế nào để sử dụng chúng để xác định vấn đề? chúng có tương ứng với một cái gì đó trong đầu ra "objdump" hoặc "readelf" không? chúng có hữu ích không nếu chương trình của tôi bị tước các ký hiệu của nó (với một tệp riêng biệt, có thể được sử dụng bằng cách sử dụng gdb)

Trả lời

7

Cũng con trỏ rip cho bạn biết hướng dẫn gây ra sự cố. Bạn cần tra cứu nó trong một tập tin bản đồ.

Trong tệp bản đồ, bạn sẽ có danh sách các hàm và địa chỉ xuất phát của chúng. Khi bạn tải ứng dụng, nó được nạp vào một địa chỉ cơ sở. Con trỏ rip - địa chỉ cơ sở cung cấp cho bạn địa chỉ tệp bản đồ. Nếu sau đó bạn tìm kiếm thông qua tệp bản đồ cho một hàm bắt đầu tại địa chỉ hơi thấp hơn con trỏ tách của bạn và được theo sau, trong danh sách, theo hàm có địa chỉ cao hơn bạn đã định vị hàm bị lỗi.

Từ đó bạn cần phải thử và xác định những gì đã xảy ra trong mã của bạn. Nó không có nhiều niềm vui nhưng nó, ít nhất, cung cấp cho bạn một điểm khởi đầu.

Chỉnh sửa: Các bit "segfault at" là nói cho bạn, tôi cược, rằng bạn đã dereferenced một con trỏ NULL. Rsp là con trỏ ngăn xếp hiện tại. Than ôi của nó có lẽ không phải tất cả những gì hữu ích. Với một bộ nhớ dump bạn "có thể" có thể tìm ra chính xác hơn nơi bạn đã có trong chức năng nhưng nó có thể được thực sự khó khăn để làm việc, chính xác, nơi bạn đang ở trong một tối ưu hóa xây dựng

3

Tôi đã nhận cũng vậy. Khi tôi thấy:

probe.out[28503]: segfault at 0000000000000180 rip 00000000004450c0 rsp 00007fff4d508178 error 4 

probe.out là một ứng dụng sử dụng libavformat (ffmpeg). Tôi tháo rời nó.

objdump -d probe.out 

Các rip là nơi mà các hướng dẫn sẽ chạy:

00000000004450c0 <ff_rtp_queued_packet_time>: 
    4450c0:  48 8b 97 80 01 00 00 mov 0x180(%rdi),%rdx 
    44d25d:  e8 5e 7e ff ff   callq 4450c0 <ff_rtp_queued_packet_time> 

cuối cùng, tôi tìm thấy ứng dụng bị rơi trong hàm ff_rtp_queued_packet_time

PS. đôi khi địa chỉ không khớp chính xác, nhưng nó gần như ở đó.

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