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

11

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

Jakub Narębski
fonte

Respostas:

10

Você pode verificar se há referências para a função mcount(ou possivelmente _mcountou de __mcountacordo com a Implementação de criaçã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.

Esteira
fonte
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 [binário]' está correta, acho

Ben
fonte
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 -pgsinalizadores, caso contrário gmon.outnão serão gerados. link stackoverflow.

  3. Eu descobri que o binário no qual eu estava executando o gprof não gerava nenhum gmon.outarquivo, apesar de compilar / vincular ao -pgsinalizador. A razão é - eu estava matando meu pedido, não era uma saída limpa. gprofgera saída somente quando o programa sai normalmente. link stackoverflow

pé quebrado
fonte