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

8

Eu sei sobre strace e ltrace, mas isso apenas me diz quais chamadas de sistema e chamadas de biblioteca um processo está executando, respectivamente. Gostaria de saber exatamente quais instruções um processo está executando. Montagem, ou algum tipo de meio termo entre C e montagem, se isso for possível. Supondo que o binário não tenha sido compilado com símbolos de depuração, é mais provável que se incline para a primeira opção.

Caso de uso: o processo parece estar travado, sem saída do strace ou ltrace. Determine se o processo está fazendo "alguma coisa". Sei que isso pode ser difícil de determinar, pois imagino que isso seja análogo à solução do problema de parada. No entanto, pode ser possível coletar dados úteis.

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

Meu palpite é que eu 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 o uso do gdb para verificar a integridade de um processo em execução.

O SO é o CentOS 6.

calças de gato
fonte
Estou bastante certo de que você pode depurar seu processo em execução com gdbou ddd. Mesmo em montagem e sem símbolos de depuração.
Valmiky Arquissandas
Relacionado: stackoverflow.com/questions/2971926/…
Ciro Santilli escreveu:

Respostas:

10

Você pode fazer isso com gdb: command nie siexecutar uma única instrução de cada vez. O comando nexecuta a próxima linha de código, para a maioria dos valores de "next". Para n(e o correspondente s) você deve ter compilado para que os símbolos de depuração apareçam no executável.

Essa resposta do stackoverflow fornece alguns métodos para fazer isso mais ou menos visualmente.

O gdbcomando: display/i $pcmostra a instrução antes de executar. display $pcmostre a linha de código antes nou a sexecute.

Bruce Ediger
fonte
Use gdb -p <pid>para anexar ao processo.
Ángel
6

Execute ps -lno ID do processo e verifique a Scoluna ("estado"). Se o estado for R, seu processo está executando o código. Se o processo permanecer no estado Re stracenão mostrar a execução de nenhuma chamada do sistema, o processo ficará preso 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 do processo, consulte O que esse processo STAT indica? , O que indica o estado "suspensão interrompida"? e se 'kill -9' não funcionar? .

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 possuir informações de depuração (o que geralmente ocorre se você não compilou o programa especialmente para isso), o depurador poderá mostrar apenas 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 Gdb ao processo, execute gdb /path/to/executable 1234onde 1234está o ID do processo. O comando spermite executar instruções uma por vez. A menos que você seja um programador e esteja familiarizado com o que o programa está fazendo, há poucas chances de obter informações úteis do Gdb nesse cenário.

Gilles 'SO- parar de ser mau'
fonte