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() останова в doSomething() и без проблем проходить через источники. Но, похоже, кажется, что источника нет.

Если я 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 type, release build), поставленного в начале функции. Возможно ли, что gdb видит этот материал, думает «странно, продолжаем после этой функции» и не обнаруживает, что для большинства функций действительно доступен источник?

(Если это важно, оно скомпилировано с LLVM / clang 3.5 в поле ARM с Ubuntu)

  • Как вступить, перешагнуть и выйти с помощью GDB?
  • Стрелка вверх GDB не работает
  • Как определить, какие инструкции выполняет процесс?
  • Conque-GDB in vim: как установить размер
  • Ошибка при установке gdb-arm-linux-gnueabi
  • Как запустить GDB в фоновом режиме и вернуть его обратно?
  • Использование gdb для проверки переменных среды
  • Как изящно выйти из Qemu VM с запущенным ядром
  • One Solution collect form web for “gdb не входит в функцию, хотя доступен источник”

    Вероятно, это проблема с оптимизацией gcc и последующей таблицей номеров строк , созданной DWARF, которая отображает

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

    (стр. 8)

    Самое простое решение – использовать stepi при достижении функции

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

    шаг

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

    ….

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

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

    Linux и Unix - лучшая ОС в мире.