gdb não entra em funcionamento embora a fonte esteja disponível

gdb não entra em funcionamento embora a fonte esteja disponível

Eu tenho uma biblioteca compartilhada compilada -g -O0incluindo:

void MyClass::whatever()
{
  ...
  doSomething(myImage, myPoints);
  ...
}

bool MyClass::doSomething(const Image& image, std::vector<cv::Vec2f>& points) const
{ 
  const int32_t foo = 1;
  const float   bar = 0.1f;
  ...
}

Agora estou avançando whatever(), smas não entra doSomething(), mas ultrapassa. Não é uma questão de disponibilidade da fonte, porque (1) está no mesmo arquivo e (2) posso definir um ponto de interrupção doSomething()e percorrer as fontes sem problemas. Mas sparece acreditar que não há nenhuma fonte disponível.

Se eu set step-mode on, recebo uma saída como

0xb5d51148 in myClass::doSomething (this=0xb25e4, image=..., 
points=std::vector of length -91315, capacity 372871920 = {...})
from /path/to/myclass.so

como você obtém quando não há fonte disponível. Depois de algumas ninicializações foo, a fonte é exibida. Portanto, pode haver alguma inlinemágica no meu parâmetro (um opencvtipo, versão de lançamento) colocado no início da função. É possível que você gdbveja essas coisas, pense "coisas estranhas, vamos continuar depois dessa função" e não descubra que realmente existe uma fonte disponível para a maior parte da função?

(Se for importante, ele é compilado com LLVM/clang 3.5 em uma caixa ARM com Ubuntu)

Responder1

Este é provavelmente um problema com a otimização do gcc e o subsequentetabela de número de linhacriado porANÃO que mapeia

endereços de memória que contêm o código executável de um programa e as linhas de origem que correspondem a esses endereços

(página 8)

A solução mais simples é usarstepiquando a função é alcançada

DeManual do usuário GDB(pág. 65)

etapa

Continue executando seu programa até que o controle alcance uma linha de origem diferente, então pare-o e retorne o controle para gdb.

....

O comando step só para na primeira instrução de uma linha de origem. Isso evita múltiplas paradas que poderiam ocorrer em instruções switch, loops for, etc. A etapa continua a parar se uma função que possui informações de depuração for chamada dentro da linha. Em outras palavras, step passos dentro de qualquer função chamada dentro da linha.

Além disso, o comando step só insere uma função se houver informações de número de linha para a função. Caso contrário, ele agirá como o próximo comando. Isso evita problemas ao usar cc -gl em máquinas MIPS. Anteriormente, step entrava em subrotinas se houvesse alguma informação de depuração sobre a rotina.

informação relacionada