it-swarm-id.com

Bagaimana cara menambahkan direktori lintasan pustaka saat file inti di gdb di Linux

Saya memiliki file inti yang dihasilkan pada sistem jarak jauh yang saya tidak memiliki akses langsung ke. Saya juga memiliki salinan lokal file perpustakaan dari sistem jarak jauh, dan file yang dapat dieksekusi untuk program macet.

Saya ingin menganalisis dump inti ini di gdb.

Sebagai contoh:

gdb path/to/executable path/to/corefile

Perpustakaan saya ada di direktori saat ini.

Di masa lalu saya telah melihat debuggers mengimplementasikan ini dengan menyediakan opsi "-p." atau "-p/=."; jadi pertanyaan saya adalah:

Bagaimana saya menentukan bahwa pustaka dimuat pertama kali dari path relatif ke direktori saya saat ini ketika menganalisis sebuah file inti di gdb?

25
Mike Tunnicliffe

Mulai gdb tanpa menentukan file yang dapat dieksekusi atau inti, lalu ketik perintah berikut:

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

Anda harus memastikan untuk mencerminkan jalur perpustakaan Anda dengan tepat dari sistem target. Di atas dimaksudkan untuk target debugging yang tidak cocok dengan Host Anda, itu sebabnya penting untuk mereplikasi struktur sistem file root Anda yang berisi perpustakaan Anda.

Jika Anda sedang men-debug server yang jauh dengan arsitektur dan versi Linux/glibc yang sama dengan Host Anda, maka Anda dapat melakukan sebagai fd disarankan:

set solib-search-path <path>

Jika Anda mencoba untuk menimpa beberapa perpustakaan, tetapi tidak semua maka Anda dapat menyalin struktur direktori perpustakaan target ke tempat sementara dan menggunakan solusi solib-absolute-prefix yang dijelaskan di atas.

40
Drew Frezell

Saya tidak yakin ini mungkin sama sekali dalam gdb tapi kemudian saya bukan ahli.

Namun saya dapat mengomentari tautan Linux dinamis. Berikut ini harus mencetak path dari semua perpustakaan bersama yang diselesaikan dan yang belum terselesaikan.

ldd path/to/executable

Kami perlu tahu bagaimana pustaka yang Anda bagikan dihubungkan dengan executable Anda. Untuk melakukan ini, gunakan perintah berikut:

readelf -d path/to/executable | grep RPATH
  • Jika perintah tidak mencetak apa pun, tautan dinamis akan menggunakan lokasi standar plus variabel lingkungan LD_LIBRARY_PATH untuk menemukan perpustakaan bersama.

  • Jika perintah mencetak beberapa baris, penghubung dinamis akan mengabaikan LD_LIBRARY_PATH dan sebagai gantinya menggunakan jalur hardcoded.

    Jika rpath yang terdaftar mutlak, satu-satunya solusi yang saya tahu adalah menyalin (atau menghubungkan tautan) pustaka Anda ke lokasi yang terdaftar.

    Jika rpath yang terdaftar adalah relatif, mereka akan berisi $ Origin yang akan diganti pada saat run oleh path executable. Pindahkan yang dapat dieksekusi atau perpustakaan untuk mencocokkan.

Untuk informasi lebih lanjut, Anda bisa mulai dengan:

man ld.so
4
bltxd

Saya menemukan kutipan ini di developer.Apple.com

set solib-search-path path

Jika variabel ini disetel, path adalah daftar direktori yang dipisahkan oleh titik dua untuk mencari pustaka bersama. solib-search-path' is used after solib-absolute-prefix 'gagal menemukan pustaka, atau jika path ke pustaka relatif bukan absolut. Jika Anda ingin menggunakan solib-search-path' instead of solib-absolute-prefix ', pastikan untuk mengatur `solib-absolute-prefix' ke direktori nonexistant untuk mencegah GDB menemukan pustaka Host Anda.

EDIT:

Saya tidak berpikir menggunakan pengaturan di atas menambah direktori yang saya tambahkan, tetapi sepertinya menambahkannya, jadi file yang hilang dari sistem saya saat ini diambil di jalur yang saya tambahkan. Saya kira pengaturan solib-absolute-prefix untuk sesuatu yang palsu dan menambahkan direktori dalam jalur pencarian-solib dalam urutan yang saya butuhkan mungkin merupakan solusi lengkap.

3
Mike Tunnicliffe

Anda juga dapat mengatur LD_PRELOAD ke masing-masing perpustakaan atau LD_LIBRARY_PATH ke direktori saat ini ketika memanggil gdb. Ini hanya akan menimbulkan masalah jika gdb sendiri mencoba menggunakan salah satu pustaka yang Anda preloading.

2
Joseph Garvin

Satu catatan penting:

jika Anda melakukan kompilasi silang dan mencoba debug dengan gdb, maka setelah selesai
file ECECUTABLE_NAME jika Anda melihat sesuatu seperti:

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

kemudian periksa apakah Anda memiliki libthread_db untuk sistem target Anda. Saya menemukan banyak masalah serupa di web. Masalah seperti itu tidak dapat diselesaikan hanya menggunakan "set solib-", Anda harus membangun libthread_db menggunakan cross-compiler Anda juga.

0
psihodelia