gdb: не может перечислить источник / символы общей библиотеки - PullRequest
0 голосов
/ 07 мая 2020

Код моего приложения C ++ находится в каталоге A, а исходный код общей библиотеки - в каталоге B. Я создаю с помощью g ++. Я указываю флаги '-g -O0' для каждого шага компиляции и не указываю '-s'. Я запускаю gdb из каталога приложения A и могу перечислить источник приложения в каталоге A. Когда я пытаюсь указать исходный файл C ++ в общей библиотеке:

(gdb) list MBQuickItem. cpp : 0 Нет исходного файла с именем MBQuickItem. cpp.

Затем я добавляю относительный путь к каталогу B к пути поиска источника:

(gdb) dir. ./Bi/ Поиск исходных каталогов: /home/oreilly/A/../Bi:$cdir:$cwd

gdb выполняет завершение пути, когда я набираю 'B', поэтому gdb четко «Знает» об этом каталоге. И все же он не может найти исходный файл:

(gdb) list MBQuickItem. cpp: 0 Нет исходного файла с именем MBQuickItem. cpp. (gdb) list ../B/MBQuickItem.cpp:0 Нет исходного файла с именем ../B/MBQuickItem.cpp.

MBQuickItem. cpp определенно существует в каталоге B .Что я делаю не так?

(Имена каталогов на самом деле не A и B - просто упрощаю ...)

Я создаю с g ++ (Ubuntu 7.5. 0-3ubuntu1 ~ 18.04) 7.5.0 Я использую GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409- git на ubuntu 18.04.3.

Вот команды (частичный список) используется для создания разделяемой библиотеки:

g ++ - c -g -pipe -O0 -std = gnu ++ 11 -Wall -Wextra -D_REENTRANT -fPIC -DMBGUI_LIBRARY -DQT_DEPRECATED_WARNINGS -DQQUGICK -DEPRECATED_WARNINGS -DQQUG_NO_QIBBICK_NO_QIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I ../../../../ Qt / 5.14.2 / gcc_64 / include -I ../../../../ Qt / 5.14.2 / gcc_64 / include / QtQuick -I ../../../../Qt/5.14.2/gcc_64/include/QtGui -I ../../../../ Qt / 5.14.2 / gcc_64 / include / QtQmlModels -I ../../../../ Qt / 5.14.2 / gcc_64 / include / QtQml -I ../../../../ Qt / 5.14.2 / gcc_64 / include / QtNetwork -I ../../../../ Qt / 5.14.2 / gcc_64 / include / QtCore -I. -isystem / usr / include / libdrm -I ../../../../ Qt / 5.14.2 / gcc_64 / mkspecs / linux -g ++ -o MBQuickItem.o MBQuickItem. cpp

[...] g ++ -g -Wl, -O1 -Wl, -rpath, / home / oreilly / Qt / 5.14.2 / gcc_64 / lib -shared -Wl, -soname, libMB Gui .so .1 -o libMB Gui .so.1.0.0 Camera.o GmtGridSurface.o MB Gui .o MBQuickItem.o MBQuickView.o Surface.o SurfaceRenderer.o moc_Camera.o moc_MBQuickItem.o moc_MBQuickView.o moc_SurofaceR /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Quick.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Gui.so /home/oreilly/Qt/5.14.2/ gcc_64 / lib / libQt5QmlModels.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Qml.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Network.so / home / oreilly / Qt / 5.14.2 / gcc_64 / lib / libQt5Core.so -lGL -lpthread ln -s libMB Gui .so.1.0.0 libMB Gui .so ln -s libMB Gui .so.1.0.0 libMB Gui .so.1 ln -s libMB Gui .so.1.0.0 libMB Gui .so.1.0

А вот команда, связывающая код приложения с разделяемой библиотекой:

g ++ -g -Wl, -O0 -Wl, -rpath, / home / oreilly / Qt / 5.14.2 / gcc_64 / lib -Wl, -rpath-link, / home / oreilly / Qt / 5.14.2 / gcc_64 / lib -o mbgrdviz-3 main.o qrc_qml.o -L ../ МБ Gui -lMB Gui -lgmt /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt53DQuickExtras.so /home/oreilly/Qt/5.14.2/gcc_64/ lib / libQt53DQuick.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Quick.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt53DExtras.so /home/oreilly/Qt/5.14. 2 / gcc_64 / lib / libQt53DRender.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt53DInput.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt53DLogic.so / home /oreilly/Qt/5.14.2/gcc_64/lib/libQt53DCore.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Gamepad.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5 Gui .so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5QmlModels.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Qml.so /home/oreilly/Qt/5.14. 2 / gcc_64 / lib / libQt5Network.so /home/oreilly/Qt/5.14.2/gcc_64/lib/libQt5Core.so -lGL -lpthread

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Согласно комментарию darcamo, выдача 'start' вместо 'run' загружает символы разделяемой библиотеки и останавливается на самой первой инструкции, после чего вы можете выполнить 'continue'.

...