Como determinar quais instruções um processo está executando?

7

Eu sei strace e ltrace, mas isso só me diz quais chamadas de sistema e bibliotecas um processo está executando, respectivamente. Eu gostaria de saber exatamente quais instruções um processo está executando. Qualquer montagem, ou algum tipo de meio termo entre C e assembly, se isso for possível. Assumindo que o binário não tenha sido compilado com símbolos de depuração, então inclinar-se para a primeira opção é mais provável.

Caso de uso: o processo parece estar interrompido, sem saída de strace ou ltrace. Determine se o processo está fazendo "alguma coisa". Eu percebo que isso pode ser difícil de determinar, pois imagino que isso seja análogo a resolver o problema da parada. No entanto, pode ser possível coletar dados úteis.

Segundo caso de uso: curiosidade. Seria interessante despejar toda a lista de instruções de montagem em uma lista de texto.

Meu palpite é que posso usar o gdb para fazer isso, mas não sei como, pois isso é menos sobre a depuração de um programa que escrevi e mais sobre como usar o gdb para verificar a integridade de um processo em execução.

OS é o CentOS 6.

    
por cat pants 30.07.2014 / 03:12

2 respostas

10

Você pode fazer isso com gdb : os comandos ni e si executam uma única instrução no momento. O comando n executa a próxima linha de código, para a maioria dos valores de "próximo". Para n (e o correspondente s ) você precisa ter compilado para que os símbolos de depuração apareçam no executável.

Esta resposta stackoverflow dá um par de métodos de fazer isso mais ou menos visualmente.

O comando gdb : display/i $pc mostra a instrução antes de ser executada. display $pc mostra a linha de código bfore n ou s executa.

    
por 30.07.2014 / 04:22
6

Execute ps -l no ID do processo e verifique a coluna S (“estado”). Se o estado for R , seu processo estará executando o código. Se o processo permanecer no estado R e strace não mostrar que está executando nenhuma chamada do sistema, o processo será interceptado em um cálculo muito longo e possivelmente infinito. Se o processo estiver e permanecer no estado D , ele será bloqueado em uma chamada do sistema. Para obter mais informações sobre estados de processo, consulte O que este processo STAT indica? ? , O que faz o "sono interrompível "indicar estado? e E se? kill -9 'não funciona? .

Se o processo estiver executando uma computação longa, você pode usar o Gdb (ou outro depurador) para ver o que está fazendo. Se o executável não tiver informações de depuração (o que geralmente é o caso se você não compilou o programa especialmente para isso), o depurador só poderá mostrar as instruções da máquina; se o executável contiver informações de depuração, você poderá ver os nomes das funções nos rastreamentos de pilha e assim por diante. Para anexar o Gdb ao processo, execute gdb /path/to/executable 1234 , em que 1234 é o ID do processo. O comando s permite executar instruções uma por vez. A menos que você seja um programador e esteja familiarizado com o que o programa deveria estar fazendo, há poucas chances de obter informações úteis do Gdb nesse cenário.

    
por 30.07.2014 / 04:24