it-swarm-tr.com

Linux'ta bir çekirdek dosyasını gdb'ye yüklerken kütüphane yolundaki bir dizini nasıl hazırlarım?

Doğrudan erişemediğim uzak bir sistemde oluşturulan bir çekirdek dosyam var. Ayrıca uzak sistemdeki kütüphane dosyalarının yerel kopyaları ve çökme programı için çalıştırılabilir dosyalarım da var.

Bu çekirdek dökümü gdb'de analiz etmek istiyorum.

Örneğin:

gdb path/to/executable path/to/corefile

Kütüphanelerim geçerli dizinde.

Geçmişte hata ayıklayıcıların "-p" seçeneğini belirleyerek bunu uyguladığını gördüm. veya "-p/=."; öyleyse sorum şu:

Gdb'de bir çekirdek dosya analiz edilirken kütüphanelerin ilk önce mevcut dizinime göre olan yollardan yüklenmesini nasıl belirleyebilirim?

25
Mike Tunnicliffe

Yürütülebilir dosyayı veya çekirdek dosyayı belirtmeden gdb'yi başlatın, sonra aşağıdaki komutları yazın:

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

Kütüphane yolunuzu tam olarak hedef sistemden yansıttığınızdan emin olmanız gerekir. Yukarıdakiler, Ana Bilgisayarınızla eşleşmeyen hedefleri ayıklamak içindir, bu nedenle kütüphanelerinizi içeren kök dosya sistemi yapınızı çoğaltmanız önemlidir.

Eğer sunucunuzla aynı mimariye ve Linux/glibc versiyonuna sahip bir sunucuda uzaktan hata ayıklama yapıyorsanız, fd recommended olarak yapabilirsiniz:

set solib-search-path <path>

Bazı kitaplıkları geçersiz kılmaya çalışıyorsanız, ancak hepsini değil, o zaman hedef kütüphane dizin yapısını geçici bir yere kopyalayabilir ve yukarıda açıklanan solib-absolute-prefix çözümünü kullanabilirsiniz.

40
Drew Frezell

Bunun gdb içinde mümkün olduğundan emin değilim ama o zaman uzman değilim.

Ancak Linux dynamic linker hakkında yorum yapabilirim. Aşağıdakiler tüm çözülmüş paylaşılan kütüphanelerin ve çözülmemiş kitapların yolunu yazdırmalıdır.

ldd path/to/executable

Paylaşılan kütüphanelerinizin yürütülebilir dosyalarınızla nasıl bağlantılı olduğunu bilmemiz gerekir. Bunu yapmak için aşağıdaki komutu kullanın:

readelf -d path/to/executable | grep RPATH
  • Komut hiçbir şey yazdırmazsa, dinamik bağlayıcı, paylaşılan kütüphaneleri bulmak için standart konumları artı LD_LIBRARY_PATH ortam değişkenini kullanır.

  • Komut bazı satırlar yazdırırsa, dinamik bağlayıcı LD_LIBRARY_PATH öğesini yok sayar ve bunun yerine sabitlenmiş kod yollarını kullanır.

    Listelenen yolların mutlak olması durumunda, bildiğim tek çözüm kütüphanelerinizi listelenen konumlara kopyalamak (ya da işaretlemek).

    Listelenen rpathlar göreceli ise, çalıştırma sırasında çalıştırılabilir dosya yolu ile değiştirilecek bir $ Origin içerecektir. Yürütülebilir dosyayı veya eşleşecek kitaplıkları taşıyın.

Daha fazla bilgi için şunlarla başlayabilirsiniz:

man ld.so
4
bltxd

Bu alıntıyı developer.Apple.com 'da buldum

set solib-search-path path

Bu değişken ayarlanırsa, yol paylaşılan kütüphaneleri aramak için iki nokta üst üste işaretli bir dizin listesidir. solib-search-path' is used after solib-absolute-prefix 'kütüphaneyi bulamıyor veya kütüphanenin yolu mutlak yerine göreceli ise başarısız olur. solib-search-path' instead of solib-absolute-prefix 'kullanmak istiyorsanız, GDB'nin Host kütüphanelerini bulmasını engellemek için' solib-absolute-prefix'i 'harici olmayan bir dizine ayarladığınızdan emin olun.

EDIT:

Yukarıdaki ayarların kullanılmasının eklediğim dizinleri hazırladığını sanmıyorum, fakat bunları ekliyor gibi görünüyor, bu yüzden mevcut sistemimde eksik olan dosyalar eklediğim yollarda toplanıyor. Sanırım solib-mutlak-ön ekini sahte bir şeye ayarlamak ve ihtiyacım olan sırada solib-arama yoluna dizin eklemek tam bir çözüm olabilir.

3
Mike Tunnicliffe

Ayrıca LD_PRELOAD'ı kütüphanelerin her birine veya LD_LIBRARY_PATH'ye gdb'yi çağırırken mevcut dizine ayarlayabilirsiniz. Bu, yalnızca gdb'nin önceden yüklediğiniz kitaplıklardan herhangi birini kullanmaya çalışması durumunda sorunlara neden olur.

2
Joseph Garvin

Bir önemli not:

eğer bir haç yapıyorsanız ve gdb ile hata ayıklamaya çalışıyorsanız,
file ECECUTABLE_NAME eğer smth görürseniz sevmek :

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

sonra hedef sisteminiz için libthread_db olup olmadığını kontrol edin. İnternette de benzer problemler buldum. Böyle bir sorun sadece "set solib-" kullanılarak çözülemez, çapraz derleyicinizi de kullanarak libthread_db'yi kurmanız gerekir.

0
psihodelia