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)

One Solution collect form web for “gdb не входит в функцию, хотя доступен источник”

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

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

(стр. 8)

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

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

шаг

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

….

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

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

  • Как запустить gdb на одном компьютере и запустить ядро ​​kgdb на другом компьютере?
  • «Отсутствует отдельный debuginfo для ...» при запуске gcore
  • Зачем GDB нужен исполняемый файл, а также дамп ядра?
  • Регистрируются ли регистры FPU / SSE / AVX в исходных дампах?
  • Истекшее время в gdb
  • Использование gdb для проверки переменных среды
  • что обрабатывает SIG33 pass nostop noprint`, когда используется в gdb
  • разрешение отклонено для ptrace под GDB
  • Стрелка вверх GDB не работает
  • Как скомпилировать ядро ​​Linux и отладить с помощью gcc и BOCHS?
  • Аппаратная точка останова в GDB + QEMU отсутствует start_kernel
  • Модуль Linux Kernel Удаленная отладка с GDB + KGDB, удаленный ответ «g» пакет слишком длинный
  • Linux и Unix - лучшая ОС в мире.