gdb: como imprimir a linha atual ou encontrar o número da linha atual?

94

list comandos imprime um conjunto de linhas, mas preciso de uma única linha, onde estou e onde provavelmente ocorreu um erro.

Boris Burkov
fonte
23
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!

kumar_m_kiran
fonte
1
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:

(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 .

user3162307
fonte
21

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.

Albfan
fonte
2
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

pravu pp
fonte
2

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.

Mazhar MIK
fonte