У меня есть общая библиотека, скомпилированная с -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 входил в подпрограммы, если была какая-либо отладочная информация о процедуре.