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.
gdb
ouddd
. Mesmo em montagem e sem símbolos de depuração.Respostas:
Você pode fazer isso com
gdb
: commandni
esi
executar uma única instrução de cada vez. O comandon
executa a próxima linha de código, para a maioria dos valores de "next". Paran
(e o correspondentes
) 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
gdb
comando:display/i $pc
mostra a instrução antes de executar.display $pc
mostre a linha de código antesn
ou as
execute.fonte
gdb -p <pid>
para anexar ao processo.Execute
ps -l
no ID do processo e verifique aS
coluna ("estado"). Se o estado forR
, seu processo está executando o código. Se o processo permanecer no estadoR
estrace
nã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 estadoD
, 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 1234
onde1234
está o ID do processo. O comandos
permite 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.fonte