Impedindo o GDB de entrar em uma function (ou arquivo)

Eu tenho algum código C ++ como este que estou percorrendo com o GDB:

void foo(int num) { ... } void main() { Baz baz; foo (baz.get()); } 

Quando estou em main() , quero entrar no foo() , mas quero passar para o baz.get() .

Os documentos do GDB dizem que “o comando step apenas entra em uma function se houver informação de número de linha para a function”, então eu ficaria feliz se eu pudesse remover as informações do número de linha para baz.get() do meu executável. Mas, idealmente, eu seria capaz de dizer ao GDB “nunca entrar em nenhuma function na class Baz”.

Alguém sabe como fazer isso?

A partir do GDB 7.4, o skip pode ser usado.

Execute info skip ou confira o manual para obter detalhes: https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html

Em vez de escolher “step”, você pode usar o comando “until” para normalmente se comportar da maneira que você deseja:

 (gdb) until foo 

Eu não sei de qualquer maneira de configurar permanentemente o gdb para pular alguns símbolos (além de eliminar suas informações de debugging).

Edit : na verdade, a documentação do GDB declara que você não pode usar até pular para locais que não estão no mesmo frame. Eu não acho que isso seja verdade, mas no caso em que é, você pode usar o avanço para o mesmo propósito:

 (gdb) advance foo 

Página 85 do manual do GDB define o que pode ser usado como argumentos de “localização” para comandos que os utilizam. Apenas colocar “foo” fará com que ele procure por uma function chamada foo, então, enquanto puder encontrá-lo, você deve ficar bem. Alternativamente, você está preso digitando coisas como o nome do arquivo: linenum for foo, e nesse caso você pode ser melhor definir um ponto de interrupção no foo e usar continue para avançar para ele.

(Eu acho que isso pode ser mais adequado como um comentário ao invés de uma resposta, mas eu não tenho reputação suficiente para adicionar um comentário ainda.)

Então, eu também quis ignorar os arquivos STL, Boost, et al (coletivamente ‘3rd Party’) durante a debugging por um tempo. Ontem eu finalmente decidi procurar uma solução e parece que o recurso mais próximo é o comando ‘skip’ no GDB.

Eu achei a habilidade ‘pular’ no GDB como útil, mas ainda é um incômodo para mim porque meu programa usa muito STL e outro código de modelo de “Terceiro”. Neste caso, tenho que marcar um monte de arquivos como pular. Após a segunda vez, percebi que seria mais útil ignorar um diretório inteiro – e o mais útil para pular um diretório e todos os subdiretórios. Dessa forma, posso pular, por exemplo, / usr, pois nenhum dos meus códigos mora lá e normalmente não tenho interesse em depurar código de terceiros. Então eu estendi o comando ‘skip’ no gdb para suportar um novo tipo ‘dir’. Agora posso fazer isso no gdb:

 skip dir /usr 

e então eu nunca paro em nenhum dos meus headers de terceiros.

Aqui está uma página web com esta informação + o patch se ajudar alguém: info & patch para pular diretórios no GDB

Parece que isso não é possível no GDB. Eu arquivei um bug .

Enquanto isso, o gdb tem o comando skip function . Basta executá-lo quando estiver dentro da function desinteressante e isso não o incomodará novamente.

skip file também é muito útil para se livrar dos internos do STL.

Como o Justin disse, foi adicionado no gdb 7.4. Para mais detalhes, dê uma olhada na documentação .