Detectar se um binário ELF foi construído com instrumentação gprof?

11

É possível verificar se determinado programa foi compilado com a instrumentação GNU gprof, ou seja, com o sinalizador '-pg' passado ao compilador e ao linker, sem executá-lo para verificar se ele geraria uma gmon.out file?

    
por Jakub Narębski 06.06.2011 / 12:55

3 respostas

10

Você pode verificar referências à função mcount (ou possivelmente _mcount ou __mcount de acordo com Implementação de perfil . Essa função é necessária para que o perfil funcione e deve estar ausente para binários sem perfil.

Algo como:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

O exemplo acima funciona em um teste rápido aqui.

    
por 06.06.2011 / 13:21
2

A expressão regular na resposta acima nem sempre funciona ... mas a idéia geral de grepping para "mcount" na saída de 'readelf -s [binary]' está correta, eu acho

    
por 31.05.2012 / 22:30
0

Adicionando mais às respostas:

  1. Para verificar a instrumentação, grep para mcount / gmon:

    $  readelf -s <binary> | egrep "gmon|mcount"    
    20: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    28: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@GLIBC_2.2.5 (2)    
    36: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS gmon-start.c    
    39: 00000000004011a0     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start    
    100: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    114: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@@GLIBC_2.2.5    
    
  2. É necessário compilar e vincular com -pg flags, caso contrário gmon.out não será gerado. link do stackoverflow.

  3. Descobri que o binário no qual eu estava executando o gprof não gerou nenhum arquivo gmon.out , apesar de compilar / vincular com -pg flag. A razão é - eu estava matando meu pedido, não era uma saída limpa. gprof gera saída apenas quando o programa sai normalmente. link stackoverflow

por 17.05.2016 / 04:07