Eu tenho uma biblioteca compartilhada compilada -g -O0
incluindo:
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()
, s
mas 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 s
parece 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 n
inicializações foo
, a fonte é exibida. Portanto, pode haver alguma inline
mágica no meu parâmetro (um opencv
tipo, versão de lançamento) colocado no início da função. É possível que você gdb
veja 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.