gdb no entra en funcionamiento aunque la fuente está disponible

gdb no entra en funcionamiento aunque la fuente está disponible

Tengo una biblioteca compartida compilada que -g -O0incluye:

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;
  ...
}

Ahora estoy avanzando whatever()con s, pero él no avanza hacia doSomething(), sino que lo supera. No es una cuestión de disponibilidad de la fuente, porque (1) está en el mismo archivo y (2) puedo establecer un punto de interrupción doSomething()y recorrer las fuentes sin ningún problema. Pero sparece creer que no hay ninguna fuente disponible.

Si lo hago set step-mode on, obtengo un resultado como

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

como se obtiene cuando no hay una fuente disponible. Después de un par de ninicializaciones foo, se muestra la fuente. Entonces podría haber algo de inlinemagia en mi parámetro (un opencvtipo, compilación de lanzamiento) colocado al comienzo de la función. ¿Es posible que gdbvea estas cosas, piense "cosas raras, continuemos después de esta función" y no descubra que realmente hay una fuente disponible para la mayor parte de la función?

(Si importa, está compilado con LLVM/clang 3.5 en una caja ARM con Ubuntu)

Respuesta1

Es probable que esto sea un problema con la optimización de gcc y la posteriortabla de números de líneacreado porENANO que mapas

direcciones de memoria que contienen el código ejecutable de un programa y las líneas fuente que corresponden a estas direcciones

(página 8)

La solución más sencilla es utilizarstepicuando se alcanza la función

DeManual de usuario del BGF(página 65)

paso

Continúe ejecutando su programa hasta que el control alcance una línea fuente diferente, luego deténgalo y devuelva el control a gdb.

....

El comando de paso solo se detiene en la primera instrucción de una línea fuente. Esto evita las paradas múltiples que de otro modo podrían ocurrir en declaraciones de cambio, bucles for, etc. El paso continúa deteniéndose si se llama a una función que tiene información de depuración dentro de la línea. En otras palabras, los pasos se realizan dentro de cualquier función llamada dentro de la línea.

Además, el comando de paso solo ingresa una función si hay información del número de línea para la función. De lo contrario, actúa como el siguiente comando. Esto evita problemas al usar cc -gl en máquinas MIPS. Anteriormente, el paso ingresaba subrutinas si había alguna información de depuración sobre la rutina.

información relacionada