Correlacionando saída de strace para chamadas de função de código-fonte

0

Estou tentando corrigir um problema de teclado em um aplicativo do Linux para o qual tenho o código-fonte. O aplicativo inicia um servidor TCP e envia eventos locais de teclado e mouse para clientes conectados. Qual é a melhor maneira de interrogar o processo do servidor em execução para descobrir quais funções de código-fonte estão sendo usadas para interceptar os pressionamentos de tecla? O utilitário strace funcionará de alguma forma? Usar o sinalizador -c com strace mostra as chamadas do sistema que o aplicativo está fazendo, mas não sabe como rastreá-las de volta às funções do arquivo de origem.

    
por joe 13.05.2013 / 18:47

1 resposta

2

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.

    
por 13.05.2013 / 20:27