Фильтрация вызовов libc из вывода callgrind от valgrind - PullRequest
4 голосов
/ 14 октября 2011

Я пытаюсь сгенерировать граф вызовов для сервера для документации . Не для любого вида профилирования.

Я сгенерировал вывод с помощью:

sudo valgrind --tool=callgrind --dump-instr=yes /opt/ats-trunk/bin/traffic_server

и преобразовал с помощью: http://code.google.com/p/jrfonseca/wiki/Gprof2Dot в файл .dot,но он содержит слишком много информации, чтобы быть полезным в качестве документации.

Я хотел бы отфильтровать вызовы библиотек, таких как libc, libstdc ++, libtcl, libhwloc и еще много чего.

nb: IПытаюсь просто найти бесполезные библиотеки, но в лучшем случае это кажется громоздким и неполным.

Большое спасибо за ваши ответы заранее.

1 Ответ

8 голосов
/ 15 октября 2011

После оглушительного молчания здесь и фактически везде, где я просил, я обратился к valgrind-users @ ML. Вот тема:

http://sourceforge.net/mailarchive/forum.php?thread_name=e847e3a9-0d10-4c5e-929f-51258ecf9dfc%40iris&forum_name=valgrind-users

Ответ Джозефа был чрезвычайно полезен, и с большим терпением со стороны #perl я собрал скрипт, который помогает мне отфильтровывать библиотеки, которые мне не нужны в моем call-графе.

Сценарий основан на том, что callgrind должен быть более подробным:

valgrind --tool=callgrind --dump-instr=yes --compress-pos=no \
  --compress-strings=no /opt/ats-trunk/bin/traffic_server

Таким образом, вместо ссылочных номеров будут создаваться строки, что значительно упрощает анализ:

#!/usr/bin/perl

use Modern::Perl;
require File::Temp;

my $cob = qr{^cob=/(?:usr/)?lib};
my $ob = qr{^ob=/(?:usr/)?lib/};
my $calls = qr{^calls=};

open (my $fh, '<', $ARGV[0]) or die $!;
my $tmp = File::Temp->new(UNLINK => 1);

## Skip all external libraries, as defined by $ob
while (readline $fh) {
    if (/$ob/ ) {
        # skip the entire ob= section we don't need.
        0 while defined($_ = readline $fh) && !/^ob=/;

        # put the last line back, we read too far
        seek($fh, -length($_), 1);
    } else {
        print $tmp $_;
    }
}
close ($fh);

## Skip all calls to external libraries, as defined by $cob
my $tmpname = $tmp->filename;
open ($tmp, '<', $tmpname) or die $!;
while (readline $tmp) {
    if (/$cob/) {

        # skip until we find a line starting with calls=
        # skip that line too
        0 while defined($_ = readline $tmp) && !/$calls/;

        # then we skip until we either hit ^word= or an empty line.
        # In other words: skip all lines that start with 0x
        0 while defined($_ = readline $tmp) && /^0x/;

        # put the last line back, we read too far
        seek($tmp, -length($_), 1);
    }  else {
       print;
    }
}
...