É 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.out
arquivo?
É 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.out
arquivo?
Respostas:
Você pode verificar se há referências para a função mcount
(ou possivelmente _mcount
ou de __mcount
acordo 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.
Adicionando mais às respostas:
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
É necessário compilar e vincular com -pg
sinalizadores, caso contrário gmon.out
não serão gerados. link stackoverflow.
Eu descobri que o binário no qual eu estava executando o gprof não gerava nenhum gmon.out
arquivo, apesar de compilar / vincular ao -pg
sinalizador. A razão é - eu estava matando meu pedido, não era uma saída limpa. gprof
gera saída somente quando o programa sai normalmente. link stackoverflow