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
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.
Nasıl hesapların yapılabilmesi dizi il...
Linux yerel GUI API nedir?...
Nasıl Linux üzerinde yerel makine biri...
Nasıl yok yerel izleme dalları budamak...
Arama "yerel" modül içinde f...