it-swarm-vi.tech

Làm thế nào để làm việc với chúng tôi

Tôi có một tệp cốt lõi được tạo trên một hệ thống từ xa mà tôi không có quyền truy cập trực tiếp. Tôi cũng có các bản sao cục bộ của các tệp thư viện từ hệ thống từ xa và tệp thực thi cho chương trình bị lỗi.

Tôi muốn phân tích kết xuất lõi này trong gdb.

Ví dụ:

gdb path/to/executable path/to/corefile

Thư viện của tôi là trong thư mục hiện tại.

Trước đây, tôi đã thấy các trình sửa lỗi thực hiện điều này bằng cách cung cấp tùy chọn "-p." hoặc "-p/=."; vì vậy câu hỏi của tôi là:

Làm cách nào tôi có thể chỉ định rằng các thư viện được tải trước tiên từ các đường dẫn liên quan đến thư mục hiện tại của tôi khi phân tích corefile trong gdb?

25
Mike Tunnicliffe

Bắt đầu gdb mà không chỉ định tệp thực thi hoặc tệp lõi, sau đó nhập các lệnh sau:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

Bạn sẽ cần đảm bảo phản chiếu chính xác đường dẫn thư viện của bạn từ hệ thống đích. Ở trên có nghĩa là để gỡ lỗi các mục tiêu không khớp với Máy chủ của bạn, đó là lý do tại sao việc sao chép cấu trúc hệ thống tệp gốc có chứa các thư viện của bạn là rất quan trọng.

Nếu bạn đang gỡ lỗi từ xa một máy chủ có cùng kiến ​​trúc và phiên bản Linux/glibc với Máy chủ của bạn, thì bạn có thể thực hiện như fd được đề xuất:

set solib-search-path <path>

Nếu bạn đang cố gắng ghi đè một số thư viện, nhưng không phải tất cả thì bạn có thể sao chép cấu trúc thư mục thư viện đích vào một nơi tạm thời và sử dụng giải pháp solib-absolute-prefix được mô tả ở trên.

40
Drew Frezell

Tôi không chắc điều này hoàn toàn có thể xảy ra trong gdb nhưng sau đó tôi không phải là chuyên gia.

Tuy nhiên tôi có thể nhận xét về Linux linker động. Sau đây sẽ in đường dẫn của tất cả các thư viện chia sẻ đã giải quyết và những thư viện chưa được giải quyết.

ldd path/to/executable

Chúng tôi cần biết làm thế nào các thư viện chia sẻ của bạn được liên kết với thực thi của bạn. Để làm điều này, sử dụng lệnh sau:

readelf -d path/to/executable | grep RPATH
  • Nếu lệnh không in gì, trình liên kết động sẽ sử dụng các vị trí tiêu chuẩn cộng với biến môi trường LD_LIBRARY_PATH để tìm các thư viện dùng chung.

  • Nếu lệnh in một số dòng, trình liên kết động sẽ bỏ qua LD_LIBRARY_PATH và sử dụng các đường dẫn được mã hóa cứng thay thế.

    Nếu các đường dẫn được liệt kê là tuyệt đối, giải pháp duy nhất tôi biết là sao chép (hoặc symlink) các thư viện của bạn vào các vị trí được liệt kê.

    Nếu các đường dẫn được liệt kê là tương đối, chúng sẽ chứa $ Origin sẽ được thay thế vào thời gian chạy bằng đường dẫn của tệp thực thi. Di chuyển hoặc thực thi hoặc các thư viện để phù hợp.

Để biết thêm thông tin, bạn có thể bắt đầu với:

man ld.so
4
bltxd

Tôi tìm thấy đoạn trích này trên developer.Apple.com

set solib-search-path path

Nếu biến này được đặt, đường dẫn là danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm các thư viện dùng chung. solib-search-path' is used after solib-perfect-prefix 'không thể xác định vị trí thư viện hoặc nếu đường dẫn đến thư viện là tương đối thay vì tuyệt đối. Nếu bạn muốn sử dụng solib-search-path' instead of solib-perfect-prefix ', hãy đảm bảo đặt' tiền tố solib-perfect-pre 'thành thư mục không tồn tại để ngăn GDB tìm thư viện của Host.

CHỈNH SỬA:

Tôi không nghĩ rằng việc sử dụng cài đặt ở trên sẽ bổ sung các thư mục tôi đã thêm, nhưng dường như nó sẽ nối thêm chúng, vì vậy các tệp bị thiếu trong hệ thống hiện tại của tôi được chọn trong các đường dẫn tôi đã thêm. Tôi đoán việc đặt tiền tố solib-perfect-thành một cái gì đó không có thật và thêm các thư mục trong đường dẫn tìm kiếm solib theo thứ tự tôi cần có thể là một giải pháp đầy đủ.

3
Mike Tunnicliffe

Bạn cũng có thể chỉ đặt LD_PRELOAD cho mỗi thư viện hoặc LD_LIBRARY_PATH vào thư mục hiện tại khi gọi gdb. Điều này sẽ chỉ gây ra sự cố nếu bản thân gdb cố gắng sử dụng bất kỳ thư viện nào bạn đang tải trước.

2
Joseph Garvin

Một lưu ý quan trọng:

nếu bạn đang thực hiện biên dịch chéo và cố gắng gỡ lỗi với gdb, thì sau khi bạn đã hoàn tất
[.__.] file ECECUTABLE_NAME nếu bạn thấy smth. như :

Using Host libthread_db library "/lib/libthread_db.so.1"

sau đó kiểm tra xem bạn có libthread_db cho hệ thống đích của mình không. Tôi tìm thấy rất nhiều vấn đề tương tự trên web. Vấn đề như vậy không thể được giải quyết chỉ bằng cách sử dụng "set solib-", bạn phải xây dựng libthread_db bằng trình biên dịch chéo của mình.

0
psihodelia