Точки останова GDB перепутаны после вызова функции? - PullRequest
1 голос
/ 13 июля 2010

У меня есть программа, которая зависит от внешней общей библиотеки, но после выполнения функции внутри библиотеки я теряю возможность использовать точки останова.

Я могу ломаться и шагать, как обычно, до тех пор, пока не выполню эту функцию, но после того, как она закончится, она никогда не сломается.Он даже не сломается на главном, если я попытаюсь использовать start во второй раз, выполняя программу.Это не проблема встроенных функций, потому что я ломал эти функции раньше, и когда я закомментировал эту функцию, все снова начало работать.

Кто-нибудь когда-нибудь сталкивался с чем-то подобным раньше?Что я могу сделать?

Использование gdb 7.1 с gcc 3.2.3

Редактировать: После некоторых подсказок от пользователей я понял, что процесс разветвляется внутри библиотечного вызова.Я не уверен, что он делает (и мне действительно все равно).Можно ли как-то это компенсировать?Я экспериментировал с режимом follow-fork как дочерним, но я действительно запутался, что происходит, когда он разветвляется, и я не могу понять, как продолжить выполнение или сделать что-нибудь полезное.

Редактировать: дальнейшее расследование.Самое близкое, что я могу сказать, это то, что GDB теряет всю информацию о своих символах.После 2-го запуска все символы преобразуются в адрес @plt, а не в фактический адрес, который они разрешали при первом запуске.Как будто вторая загрузка процесса теряет всю информацию, полученную в первый раз, и отказывается перезагружать его.Я так растерялся !!

Редактировать: Итак, я проследил проблему до vfork вызова с открытым доступом.Видимо GDB не очень хорошо с popen?Как только я отсоединяюсь от процесса popen'd vforked, я теряю все свои символы.Я также прочитал некоторые отчеты онлайн об этом. Есть ли надежда ?

1 Ответ

1 голос
/ 15 июля 2010

Это комбинация vfork(2) и exec(2), которая все портит. Цитирование из gdb руководства ( отладка вил ):

В некоторых системах, когда дочерний процесс порождается vfork, вы не можете отлаживать дочерний или родительский процесс, пока не завершится вызов exec.
...
По умолчанию после выполнения вызова exec GDB отбрасывает символы предыдущего исполняемого образа. Вы можете изменить это поведение с помощью команды set follow-exec-mode.


Оставьте follow-fork-mode на parent и follow-exec-mode на same.

В качестве альтернативы, если ваша установка поддерживает многопроцессную отладку (так должно быть, поскольку ваша gdb версия - 7.1), попробуйте использовать info inferiors, чтобы найти исходный процесс и переключиться на него с помощью inferior <num>.

...