У меня есть общий вопрос gdb/gdbserver. Я пытаюсь отладить встроенное приложение arm linux с помощью gdb на хосте и gdbserver на удаленной цели. Я могу перейти через строки кода в начале основного. Однако gdb (или gdbserver), кажется, теряется после вызовов функций разделяемой библиотеки. Даже когда я устанавливаю точку останова после вызова и продолжаю использовать, он никогда не попадает в точку останова. Я знаю, что у меня нет символов в разделяемых библиотеках, и я действительно не хочу вступать в них. Не следует ли мне успешно переходить через вызовы библиотеки в gdb даже без символов, находящихся в разделяемых библиотеках, или, по крайней мере, продолжать следующую точку останова? Или это указывает на другой тип проблемы?Выполнение вызовов библиотеки с помощью gdb/gdbserver
9
A
ответ
1
Точки останова по адресу, а не по символу, иногда более надежны.
Попробуйте это:
(gdb) x/i my_func 0x12345678 <my_func> ... (gdb) break *0x12345678
У вас есть доказательства из другого источника, который указывает, что он выполняет инструкции (ы) в контрольной точке? Вместо того, чтобы просматривать источник высокого уровня, посмотрите на разборку, чтобы увидеть прошлую интерпретацию 'gdb'. –
Возникает ли проблема с одним конкретным общим объектом или вы можете создать тривиальный «тестовый пример», который иллюстрирует проблему? –
Извините за длительное время отклика. Код работает правильно на встроенном устройстве. Это просто gdb или gdbserver, которые теряются. После вызова функции библиотеки она теряет следы своего места в программе и никогда не сможет восстановить контроль. Я не думаю, что это обязательно все функции библиотеки, так как она попадает на один, open(), что она не может пройти раньше на этапе выполнения. – Jim