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

  • Emscripten принципиально несовместим с clang on linux
  • Отладка проблемы с приостановкой печати с PM_TRACE
  • Рекомендации по ведению журналов ошибок (система, драйвер устройства и приложение)
  • Как определить, какие инструкции выполняет процесс?
  • Разработка Linux, Debugger
  • Можем ли мы получить информацию о компиляторе из двоичного файла эльфа?
  • Если я 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)

  • как установить новейший clang 3.8 по apt
  • m4, используя переменное количество вкладок для выравнивания столбца
  • номера строк отображения vimrc
  • Как включить ядро ​​pstore?
  • Отладка сети: внезапное увеличение потери пакетов и задержки
  • Как запустить gdb на одном компьютере и запустить ядро ​​kgdb на другом компьютере?
  • One Solution collect form web for “gdb не входит в функцию, хотя доступен источник”

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

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

    (стр. 8)

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

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

    шаг

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

    ….

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

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

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