inicializando o kernel de depuração para perf

0

Estou tentando fazer alguns testes de desempenho, descobri que a maioria das sobrecargas está presente no kernel (kernel.kallsyms).

Então, eu preciso do kernel com símbolos de depuração e extrai o vmlinuz para executar o relatório do perf com a opção -k.

Instalei o pacote de depuração do kernel a partir do ddebs, mas não sei como inicializar o kernel. Eu corro update-grub2 mas o kernel não apareceu na lista ..

Eu verifiquei o pacote e descobri que o kernel está instalado em / usr / lib / debug - existem suas bibliotecas (libc etc) e módulos do kernel.

Agora não consigo encontrar uma maneira de carregar o kernel no momento da inicialização.

Eu acho que preciso ser kernel runnig com símbolos de depuração para que o perf funcione corretamente com a opção -k - caso contrário os endereços de memória não serão mapeados corretamente - certo?

Eu executo o perf -k no kernel sem executar o mesmo, mas não tenho certeza se isso está correto ..

    
por nayana 04.11.2015 / 12:32

1 resposta

0

Ok, na verdade, ele está executando bem o perf em relação ao kernel de depuração quando apenas o kernel normal é carregado.

Btw o kernel foi instalado com este tutorial para systemtap: link

Eu notei algumas coisas - o kernel de depuração já foi extraído - o nome é vmlinux não vmlinuz e é grande ..

a segunda coisa quando eu carrego no gdb eu vejo exatamente o mesmo número e o tempo de compilação é o mesmo do meu kernel não-debug carregado:

uname -a
Linux delo 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

e o gdb (baseado em this :

(gdb) print init_uts_ns.name
$1 = {sysname = "Linux", '
perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic
0' <repeats 59 times>, nodename = "(none)", '
- 3,18%  app  [kernel.kallsyms]  [k] copy_user_enhanced_fast_string
 - copy_user_enhanced_fast_string
  - 98,98% system_call 
     -syscall 
       68,60% 0xbeef0100
       31,40% 0xbeee0100 
  + 0,54% generic_file_aio_read 
0' <repeats 58 times>, release = "3.13.0-55-generic", '
uname -a
Linux delo 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
0' <repeats 47 times>, version = "#94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015", '
(gdb) print init_uts_ns.name
$1 = {sysname = "Linux", '
perf report -g -k /usr/lib/debug/boot/vmlinux-3.13.0-55-generic
0' <repeats 59 times>, nodename = "(none)", '
- 3,18%  app  [kernel.kallsyms]  [k] copy_user_enhanced_fast_string
 - copy_user_enhanced_fast_string
  - 98,98% system_call 
     -syscall 
       68,60% 0xbeef0100
       31,40% 0xbeee0100 
  + 0,54% generic_file_aio_read 
0' <repeats 58 times>, release = "3.13.0-55-generic", '%pre%0' <repeats 47 times>, version = "#94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015", '%pre%0' <repeats 21 times>, machine = "x86_64", '%pre%0' <repeats 58 times>, domainname = "(none)", '%pre%0' <repeats 58 times>}
0' <repeats 21 times>, machine = "x86_64", '%pre%0' <repeats 58 times>, domainname = "(none)", '%pre%0' <repeats 58 times>}

Quero dizer que a parte # 94 ... é a mesma.

Quando executo o perfo gravado com:

%pre%

atualmente funciona bem - vejo os símbolos do kernel traduzidos para funções reais (-g é apenas para calltrace):

%pre%

alguém me disse que quando o kernel inicializava e o kernel usado pelo perf não se alinhava, eu definitivamente o via - as funções das amostras do kernel não faziam sentido (apenas alguns dados aleatórios em vez do nome real).

    
por nayana 04.11.2015 / 16:16