Você pode usar o SystemTap para esse tipo de coisa.
-
Primeiro, configure seu sistema. Você precisa do SystemTap, cabeçalhos correspondentes ao seu kernel em execução e símbolos de depuração para o mesmo. No Debian, fazê-lo funcionar é algo como:
sudo apt-get install systemtap sudo apt-get install linux-headers-$(uname -r) sudo apt-get install linux-image-$(uname -r)-dbg
Pode ser um pouco difícil fazê-lo funcionar, porque os cabeçalhos e símbolos do kernel precisam corresponder exatamente ao seu kernel em execução. Espero que seja simples no Gentoo.
-
Em seguida, salve este arquivo como
mmap.stp
:#! /usr/bin/env stap # -*- systemtap -*- global last_args probe syscall.mmap2 { last_args[tid()] = argstr; } probe syscall.mmap2.return { errno = errno_p(returnval()) if (errno != 0) { printf("%s[%d] mmap2(%s) failed: %d (%s)\n", execname(), pid(), last_args[tid()], errno, errno_str(errno)); } } probe begin { printf("begin\n"); } probe end { printf("end\n"); }
-
Execute com
sudo stap mmap.stp
Depois que ele compilar e imprimir begin
, ele assistirá a todas as chamadas do sistema mmap()
e salvará seus argumentos. Se ocorrer um erro, você obterá uma saída que inclui o nome do programa, a ID do processo, os argumentos e o código de erro. Por exemplo, executando este programa sem sentido:
int main() {
mmap(1,-1,123,0,1,0);
}
fornece a saída do SystemTap:
test[9601] mmap2(0x1, 4294967295, PROT_READ|PROT_WRITE|PROT_SEM|0x70, 0x0, 1, 0) failed: 22 (EINVAL)