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.


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!


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 .


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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.