backtraceou where, mesmo info lineou simplesmente bt(para backtrace). dirac.org/linux/gdb para um tutorial de gdb
dwalter
btou backtraceou whereimprime pilha de chamadas de função, fou frameimprime a próxima linha para executar.
Eric Wang
Respostas:
21
Eu obtenho as mesmas informações durante a depuração. Embora não enquanto estou verificando o rastreamento de pilha. Muito provavelmente você teria usado o sinalizador de otimização, eu acho. Verifique este link - algo relacionado.
Tente compilar com -g3remove qualquer sinalizador de otimização. Então pode funcionar. HTH!
Ah, embora meu programa tenha sido compilado -gpara conter informações de depuração, estou atualmente em um frame de pilha, obtido de uma das bibliotecas compartilhadas, que aparentemente não foi compilado para conter informações de linha. Obrigado, Kumar.
Boris Burkov
104
O comando 'frame' fornecerá o que você está procurando. (Isso pode ser abreviado apenas 'f'). Aqui está um exemplo:
Sem um argumento, 'frame' apenas diz onde você está (com um argumento, ele muda o frame). Mais informações sobre o comando frame podem ser encontradas aqui .
Tenha em mente que o gdb é um comando poderoso - capaz de instruções de baixo nível - então está vinculado aos conceitos de montagem.
O que você está procurando é chamado de ponteiro de instrução, ou seja:
O registrador de ponteiro de instrução aponta para o endereço de memória que o processador tentará executar em seguida. O ponteiro de instrução é denominado ip no modo de 16 bits, eip no modo de 32 bits e rip no modo de 64 bits.
GDB não suporta o modo de 16 bits, eu acredito, então ipnunca é usado aqui. Além disso, em vez de ortografia explicitamente o nome do contador de programa, você pode usar alias GDB para ele: $pc. Assim x/10i $pc, desmontará 10 instruções no ponteiro de instrução atual, independentemente da arquitetura - funcionará em i386, x86_64, ARM etc.
Ruslan
19
Comando onde ou quadro podem ser usados. onde o comando dará mais informações com o nome da função
Todas as respostas acima estão corretas, o que eu prefiro é usar o modo tui (ctrl + XA) que mostra sua localização e a função em uma janela separada que é muito útil para os usuários. Espero que isso ajude também.
backtrace
ouwhere
, mesmoinfo line
ou simplesmentebt
(para backtrace). dirac.org/linux/gdb para um tutorial de gdbbt
oubacktrace
ouwhere
imprime pilha de chamadas de função,f
ouframe
imprime a próxima linha para executar.Respostas:
Eu obtenho as mesmas informações durante a depuração. Embora não enquanto estou verificando o rastreamento de pilha. Muito provavelmente você teria usado o sinalizador de otimização, eu acho. Verifique este link - algo relacionado.
Tente compilar com
-g3
remove qualquer sinalizador de otimização. Então pode funcionar. HTH!fonte
-g
para conter informações de depuração, estou atualmente em um frame de pilha, obtido de uma das bibliotecas compartilhadas, que aparentemente não foi compilado para conter informações de linha. Obrigado, Kumar.O comando 'frame' fornecerá o que você está procurando. (Isso pode ser abreviado apenas 'f'). Aqui está um exemplo:
Sem um argumento, 'frame' apenas diz onde você está (com um argumento, ele muda o frame). Mais informações sobre o comando frame podem ser encontradas aqui .
fonte
Tenha em mente que o gdb é um comando poderoso - capaz de instruções de baixo nível - então está vinculado aos conceitos de montagem.
O que você está procurando é chamado de ponteiro de instrução, ou seja:
mais detalhes aqui
todos os registros disponíveis na execução do gdb podem ser mostrados com:
com ele você pode descobrir em qual modo seu programa está rodando (ver quais desses registradores existem)
então (aqui usando o rip de registro mais comum hoje em dia, substitua por eip ou muito raramente ip se necessário):
mostrará o número da linha e a fonte do arquivo
mostrará essa linha com alguns antes e depois
mas provavelmente
deve ser suficiente em muitos casos.
fonte
ip
nunca é usado aqui. Além disso, em vez de ortografia explicitamente o nome do contador de programa, você pode usar alias GDB para ele:$pc
. Assimx/10i $pc
, desmontará 10 instruções no ponteiro de instrução atual, independentemente da arquitetura - funcionará em i386, x86_64, ARM etc.Comando onde ou quadro podem ser usados. onde o comando dará mais informações com o nome da função
fonte
Todas as respostas acima estão corretas, o que eu prefiro é usar o modo tui (ctrl + XA) que mostra sua localização e a função em uma janela separada que é muito útil para os usuários. Espero que isso ajude também.
fonte