list
comandos imprime um conjunto de linhas, mas preciso de uma única linha, onde estou e onde provavelmente ocorreu um erro.
bt
ou backtrace
ou where
imprime pilha de chamadas de função, f
ou frame
imprime a próxima linha para executar.
list
comandos imprime um conjunto de linhas, mas preciso de uma única linha, onde estou e onde provavelmente ocorreu um erro.
bt
ou backtrace
ou where
imprime pilha de chamadas de função, f
ou frame
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!
-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:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
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.
mais detalhes aqui
todos os registros disponíveis na execução do gdb podem ser mostrados com:
(gdb) info registers
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):
(gdb)info line *$rip
mostrará o número da linha e a fonte do arquivo
(gdb) list *$rip
mostrará essa linha com alguns antes e depois
mas provavelmente
(gdb) frame
deve ser suficiente em muitos casos.
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
. Assim x/10i $pc
, desmontará 10 instruções no ponteiro de instrução atual, independentemente da arquitetura - funcionará em i386, x86_64, ARM etc.
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 gdb