SORU
22 Kasım 2008, CUMARTESİ


Yerel işlev izleme aracı Linux aramalar

Yerel olarak çalıştırılabilir bir dosya içinde tanımlanan fonksiyonlar takip edebilirsiniz ltrace strace gibi bir araç arıyorum. ltrace sadece dinamik kütüphane çağrıları izler ve trace sadece izleri sistem çağrıları. Örneğin, aşağıdaki C programı verilir

#include <stdio.h>

int triple ( int x )
{
  return 3 * x;
}

int main (void)
{
  printf("%d\n", triple(10));
  return 0;
}

Çalışma programı ile ltrace gösteri çağrısı printf beri böyle bir standart kütüphane fonksiyonu olan bir dinamik kütüphane benim sistemi) ve strace show tüm sistem çağrıları başlatma kodu, sistem çağrıları uygulamak için kullanılan, basit bir beşgen kullanmaktır, ve kapatma kodu, ama istediğim bir şey olacak bana göster işlevi triple idi. Yerel fonksiyonları optimize derleyici tarafından inlined değil ve ikili (semboller kaldırıldı) mahrum edildiğini varsayarak, bunu yapmak için bir araç var mı?

Edit

Açıklamalar bir çift vardır:

  • Eğer aracı aynı zamanda yerel olmayan işlevleri için izleme bilgi sağlar Eğer Tamam.
  • Program(lar) belirli araçlar için desteği ile yeniden derlemek zorunda kalmak istemiyorum, yürütülebilir simge bilgi yeterli olacaktır.
  • Eğer aracı ltrace/trace ile benim gibi mevcut süreçlere bağlamak için kullanabilirim Eğer gerçekten güzel olurdu.

CEVAP
22 Kasım 2008, CUMARTESİ


Sadece özel fonksiyonlar için haberdar olmak istiyorum varsayarak, bu gibi olabilir

hata ayıklama bilgilerini (zaten sembol bilgi sahibi olarak, muhtemelen de yeterli Temizle var) derleme

verildi

#include <iostream>

int fac(int n) {
    if(n == 0)
        return 1;
    return n * fac(n-1);
}

int main()
{
    for(int i=0;i<4;i  )
        std::cout << fac(i) << std::endl;
}

Kullanım gdb izlemek için:

[js@HOST2 cpp]$ g   -g3 test.cpp
[js@HOST2 cpp]$ gdb ./a.out
(gdb) b fac
Breakpoint 1 at 0x804866a: file test.cpp, line 4.
(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent
>bt 1
>c
>end
(gdb) run
Starting program: /home/js/cpp/a.out
#0  fac (n=0) at test.cpp:4
1
#0  fac (n=1) at test.cpp:4
#0  fac (n=0) at test.cpp:4
1
#0  fac (n=2) at test.cpp:4
#0  fac (n=1) at test.cpp:4
#0  fac (n=0) at test.cpp:4
2
#0  fac (n=3) at test.cpp:4
#0  fac (n=2) at test.cpp:4
#0  fac (n=1) at test.cpp:4
#0  fac (n=0) at test.cpp:4
6

Program exited normally.
(gdb)

Tüm fonksiyon adreslerini toplamak için:

tmp=$(mktemp)
readelf -s ./a.out | gawk '
{ 
  if($4 == "FUNC" && $2 != 0) { 
    print "# code for " $NF; 
    print "b *0x" $2; 
    print "commands"; 
    print "silent"; 
    print "bt 1"; 
    print "c"; 
    print "end"; 
    print ""; 
  } 
}' > $tmp; 
gdb --command=$tmp ./a.out; 
rm -f $tmp

Not bunun yerine, sadece baskı geçerli Kare(bt 1), yapabileceğiniz bir şey gibi, baskı değeri bazı küresel, yürütülen bazı kabuk komut veya posta bir şey varsa vurur fatal_bomb_exploded fonksiyon :) ne yazık ki, gcc çıkışları bazı "Geçerli Dil değişti" mesajları arasında. Ama bu kadar kolay grepped. Büyütülecek bir şey değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • TV nEW

    TV nEW

    25 AĞUSTOS 2012