2010-08-27 45 views
7

Tôi gặp vấn đề sau: khi tôi nhận được backtrace trong C bằng cách sử dụng hàm backtrace (3), các ký hiệu trả về tên của hàm có thể dễ dàng xác định được với thư viện lùn và dladdr (3).Cách lấy tên hàm của con trỏ chức năng C

Vấn đề là nếu tôi có một con trỏ hàm đơn giản (ví dụ: bằng cách chuyển nó & chức năng) các hàm lùn + lùn không thể trợ giúp. Dường như con trỏ khác với con trỏ được trả về bởi backtrace (3) (nó không lạ, vì backtrace nhận được các con trỏ hàm này ngay từ stack).

Câu hỏi của tôi là liệu có một số phương pháp để giải quyết các tên này không? Ngoài ra, tôi muốn biết chính xác sự khác biệt giữa hai con trỏ là gì.

Cảm ơn!

UPDATE:

Sự khác biệt giữa con trỏ là khá đáng kể:
Người Tôi nhận được với backtrace là: 0x8048ca4
Phiên bản con trỏ trực tiếp: 0x3ba838

Dường như với tôi rằng thứ hai một nhu cầu một bù đắp.

+0

Các con trỏ * rất * khác nhau, hoặc chỉ tắt một chút? – bstpierre

+0

@bstpierre: Đã cập nhật câu hỏi. – terminus

+1

Các con trỏ tìm thấy trên ngăn xếp thường là địa chỉ của lệnh sau khi cuộc gọi đến chức năng hiện tại. Họ thường không giống như con trỏ đến mục nhập của bất kỳ chức năng. – RBerteig

Trả lời

0

addr2line (1) có thể chỉ là thứ bạn đang tìm kiếm.

+0

Nó rất đẹp nhưng vì điều này chỉ có thể giải quyết cùng một loại con trỏ mà tôi đã có thể (cái mà được cung cấp bởi backtrace). Ngoài ra, đây là một chức năng dòng lệnh và tôi đang tìm một giải pháp 'chương trình'. – terminus

1

Đoán từ những khác biệt đáng kể trong các địa chỉ điển hình mà bạn trích dẫn, một là từ thư viện được chia sẻ thực tế và một từ tệp thực thi chính của bạn. Đọc giữa các dòng của man page for dladdr(3), có thể là trường hợp nếu biểu tượng không nằm trong mô-đun được tải bởi dlopen(3) thì có thể không thể tạo lại tên tệp và biểu tượng phù hợp.

Tôi cho rằng bạn chưa loại bỏ các biểu tượng khỏi bất kỳ mô-đun nào mà bạn quan tâm ở đây hoặc tất cả các phiên cược đều bị tắt. Nếu tệp thực thi có biểu tượng, thì có thể tìm kiếm chúng cho một đối tượng khớp chính xác cho địa chỉ của bất kỳ hàm có thể đặt tên nào. Một con trỏ tới hàm chỉ là vậy thôi.

+0

Cả hai con trỏ trong ví dụ đại diện cho cùng một chức năng. – terminus

+0

Ồ. Hmm. Điều đó đặt một khuôn mặt khác vào nó .... Tôi không biết làm thế nào năng động liên kết thực sự là * thực hiện * trong * nix, nhưng nếu có stubs cho thư viện nạp sau đó có thể giải thích tất cả mọi thứ. Con trỏ hàm trỏ tới một nhánh mà nhảy đến hàm thực tế trong thư viện, có lẽ. – RBerteig

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