tldr: O mtrace ainda funciona ou estou fazendo errado?
Eu estava tentando usar o mtrace e não consegui gravar dados em um arquivo. Eu segui as instruções em man 3 mtrace
:
t_mtrace.c:
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
mtrace();
for (int j = 0; j < 2; j++)
malloc(100); /* Never freed--a memory leak */
calloc(16, 16); /* Never freed--a memory leak */
exit(EXIT_SUCCESS);
}
Em seguida, execute isso no bash:
gcc -g t_mtrace.c -o t_mtrace
export MALLOC_TRACE=/tmp/t
./t_mtrace
mtrace ./t_mtrace $MALLOC_TRACE
mas o arquivo /tmp/t
(ou qualquer outro arquivo que tento usar) não foi criado. Quando eu crio um arquivo vazio com esse nome, ele permanece com comprimento zero. Tentei usar caminhos relativos no MALLOC_TRACE. Tentei adicionar setenv("MALLOC_TRACE", "/tmp/t", 1);
dentro do programa antes da mtrace()
chamada. Tentei adicionar muntrace()
antes que o programa termine. Tentei essas táticas no Ubuntu 22.04 e no Fedora 39 e obtive o mesmo resultado: o arquivo de rastreamento está vazio. O ctime e o mtime no arquivo (se eu criá-lo com antecedência) permanecem inalterados quando executo o programa. Verifiquei que as permissões do arquivo e seu diretório pai são de leitura/gravação. strace
não está mostrando que o arquivo em questão está stat
editado, muito menos aberto.
Isso ocorre usando Glibc 2.35 no Ubuntu e 2.38 no Fedora.
Esta não é uma questão de como criar um perfil ou verificar vazamentos de memória. Sei que posso fazer isso com valgrind
meia dúzia de outros programas, isso é principalmente uma curiosidade e eu quero saber se isso é um bug que precisa ser corrigido ou se a página de manual precisa ser atualizada (ou se estou apenas entendendo mal alguma coisa e o único problema é sentar na minha cadeira).