GDB установить разрыв в .so файле, без имени исходного файла - PullRequest
0 голосов
/ 30 января 2019

Я строю проект ведьма cmake.У меня есть один исполняемый файл и несколько .so файлов, сгенерированных после make.Файл .so находится в каталоге dir build/lib, а исполняемый файл - в каталоге dir build/bin.

Мне нравится проект dir,

-main.cpp
-test.cpp
--cfd/cfd.cpp

cfd.cpp генерировать cfd.soи, наконец, он ссылается на исполняемый файл.

Я могу установить разрывы в некоторых файлах src, таких как main.cpp, test.cpp и т. д., но я не могу установить разрывы в связанном .soисходный файл, например cfd.cpp.

Я пробовал несколько методов, таких как,

  • set LD_LIBRARY_PATH (или ldconfig [.so dir])
  • setsolib-search-path

когда я запускаю gdb, программа может загрузить файл .so.Я использую info shared, вывод как ниже.enter image description here

но я не могу установить разрывы на cfd.cpp.Я использую команду b cfd.cpp:33, строка 33 - это функция, которая вызывается в test.cpp.GDB выводит информацию следующим образом:

No source file named cfd.cpp.   
Make breakpoint pending on future shared library load? (y or [n]

Может ли кто-нибудь помочь мне, спасибо.

1 Ответ

0 голосов
/ 31 января 2019

Я не могу установить разрывы в cfd.cpp

Это потому, что ваш libcfd_interface.so скомпилирован без отладочной информации (вот что немного (*} рядом с ним означает, как GDB сообщает вам в конце info shared вывода).

Исправление заключается в том, чтобы восстановить его с флагом -g.

Я нашелпри компиляции в .so команда не имеет опции -g и других .so.Но libgbk.so можно прочитать

Вы ошибаетесь.Если libgbk.so является скомпилированным без флага -g, то вы также не сможете установить точки останова в нем.

Обратите внимание, что флаг -g требуется, когда компиляция , которая отличается от компоновки (вы показываете команду link для libcfd_interface.so, так что вы можете путать их).

...