gdb не выполняет функцию, хотя исходный код доступен

gdb не выполняет функцию, хотя исходный код доступен

У меня есть общая библиотека, скомпилированная с -g -O0использованием следующих компонентов:

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

Теперь я делаю шаг через whatever(), sно он не переходит в doSomething(), а проходит через него. Это не вопрос доступности исходного кода, потому что (1) он находится в том же файле и (2) я могу установить точку останова doSomething()и пройти через исходный код без проблем. Но, sпохоже, считает, что исходный код недоступен.

Если я set step-mode on, я получаю вывод вроде

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

как вы получаете, когда нет доступного исходного кода. После пары nинициализаций fooотображается исходный код. Так что может быть какая-то inlineмагия от моего параметра ( opencvтип, сборка релиза), помещенного в начало функции. Возможно ли, что, gdbувидев это, он думает: «Странные вещи, давайте продолжим после этой функции» и не обнаруживает, что для большей части функции действительно доступен исходный код?

(Если это имеет значение, он скомпилирован с помощью LLVM/clang 3.5 на ARM-компьютере с Ubuntu)

решение1

Вероятно, это проблема с оптимизацией gcc и последующимтаблица номеров строксделаноГНОМ что карты

адреса памяти, содержащие исполняемый код программы и исходные строки, соответствующие этим адресам

(страница 8)

Самое простое решение — использоватьстепикогда функция достигнута

ОтРуководство пользователя GDB(стр. 65)

шаг

Продолжайте выполнение программы, пока управление не достигнет другой исходной строки, затем остановите ее и верните управление gdb.

....

Команда step останавливается только на первой инструкции исходной строки. Это предотвращает множественные остановки, которые в противном случае могли бы произойти в операторах switch, циклах for и т. д. step продолжает останавливаться, если внутри строки вызывается функция, имеющая отладочную информацию. Другими словами, step делает шаги внутри любых функций, вызываемых внутри строки.

Кроме того, команда step входит в функцию только в том случае, если для функции есть информация о номере строки. В противном случае она действует как следующая команда. Это позволяет избежать проблем при использовании cc -gl на машинах MIPS. Ранее step входил в подпрограммы, если была какая-либо отладочная информация о процедуре.

Связанный контент