O utilitário strace
mostra suas chamadas do sistema. A maioria dos programas compilados no Linux eventualmente se vincula à biblioteca C padrão, conhecida como "glibc", embora o nome real do arquivo da biblioteca seja libc.so.6
. As "chamadas de sistema" da linguagem C, como "abrir", "ler", "escrever" são, na verdade, funções de invólucro para as chamadas de sistema reais que a biblioteca glibc executa. Às vezes, os wrappers incluem uma quantidade surpreendente de código em que você normalmente não pensa. Às vezes, os programadores usam bibliotecas com funções que fazem várias chamadas glibc que fazem várias chamadas do sistema. Além disso, se você vir uma "leitura" específica na saída strace
, não terá como conectá-la a uma chamada específica de "leitura" ou outra função de biblioteca no código-fonte. O resultado disso é que não há uma maneira geral de correlacionar strace
output com linhas específicas de código em um arquivo de origem.
Eu assumo que quando você declara que você tem o código-fonte, significa que você também pode compilá-lo em um programa executável em funcionamento. Se esse for realmente o caso, a melhor opção é instrumentar o código com printf
s, seguido de fflush(stdout)
e, em seguida, executar o programa em strace
. Para o printf
s você pode tentar algo como
printf(__FILE__ ", %s:%d Entered\n", __FUNCTION__, __LINE__), fflush(stdout);
no início de cada função C. Você pode definir a linha acima como um pré-processador marcro que é condicionalmente definido como acima ou como nada, dependendo de outra macro como DEBUG
, para que você possa deixar essas macros em sua base de código e compilar o código com ou sem DEBUG
definido.
Você verá as chamadas do sistema printf
"write" e suas saídas intercaladas entre a chamada do sistema que está lendo as combinações de teclas. Isso deve permitir que você se concentre nas funções do código-fonte que estão lendo a entrada tty. Pode exigir algum esforço persistente.