Как установить точки останова в будущих разделяемых библиотеках с помощью флага команды

94

Я пытаюсь автоматизировать сеанс gdb с помощью --commandфлага. Я пытаюсь установить точку останова для функции в разделяемой библиотеке (эквивалент DLL в Unix). Мой cmds.gdb выглядит так:

set args /home/shlomi/conf/bugs/kde/font-break.txt
b IA__FcFontMatch
r

Однако я получаю следующее:

shlomi: ~ / progs / bugs-external / kde / font-break $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (выпуск Mandriva Linux 2009.0)
Авторское право (C) 2008 Free Software Foundation, Inc.
Лицензия GPLv3 +: GNU GPL версии 3 или новее 
Это бесплатное программное обеспечение: вы можете изменять и распространять его.
НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Типа "показать копирование"
и "показать гарантию" для подробностей.
Этот GDB был настроен как "i586-mandriva-linux-gnu" ...
(символы отладки не найдены)
Функция «IA__FcFontMatch» не определена.
Сделать точку останова отложенной при будущей загрузке разделяемой библиотеки? (y или [n]) [ответил N; ввод не с терминала]

Так что точка останова в конце концов не устанавливается. Как я могу установить по умолчанию ответ «y», чтобы установить точки останова при ожидающей будущей загрузке разделяемой библиотеки?

Я вспоминаю, что я мог что-то сделать, но не могу вспомнить что.

Шломи Фиш
источник

Ответы:

153

Отвечая самому себе, я хотел бы дать ответ, который мне кто-то дал в IRC:

(gdb) предложения ожидают рассмотрения
действия - укажите действия, которые необходимо выполнить в точке трассировки.
set breakpoint - настройки, специфичные для точки останова
set breakpoint pending - Установить поведение отладчика относительно ожидающих точек останова
show breakpoint - специфические настройки точки останова
show breakpoint pending - Показать поведение отладчика относительно ожидающих точек останова

Таким образом, установка отложенной точки останова делает свое дело; он используется, cmds.gdbнапример, например

set breakpoint pending on
break <source file name>:<line number>
Шломи Фиш
источник
1
это спасло меня от попытки отладки под Windows 7 с использованием MinGW, настройка по умолчанию была другой, чем в Linux - большое спасибо
bph
По какой-то причине я получаю эту ошибку Program received signal SIGILL, Illegal instruction. Я получаю точки останова из файла, и у меня есть, set breakpoint pending onпоскольку некоторые из моих точек останова находятся в библиотеке, которую загружает программа. Если я добавляю точки останова вручную, ошибки не возникает. Кто-нибудь еще сталкивается с подобной проблемой?
brokenfoot 05
@brokenfoot: Я думаю, вам следует задать свой вопрос в новом вопросе верхнего уровня, а не в комментарии к ответу здесь. Таким образом, больше людей заметят это. Более того, вы должны предоставить больше информации о вашей системе.
Шломи Фиш
12

ОТ: В терминале отладка Caja в одну строку будет выглядеть так:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync
äxl
источник
3
Где вы нашли переключатель «ex»? Я не могу найти ссылку на этот параметр в документации (но он работает :))
Gearoid Murphy
-exу меня не сработало. Мне пришлось поместить команды в файл tmp и позвонить с помощью:gdb -x /tmp/gdb.commands myexecutible
Джейсон Мур
5

Без символов.

objdump -t /lib/libacl.so
SYMBOL TABLE:
no symbols
objdump -T /lib/libacl.so
...
00002bd0 g    DF .text  000000d0  ACL_1.0     acl_delete_entry
...


(gdb) break 0x0002bd0 

(gdb) x/20i acl_delete_entry
0x2bd0 <acl_delete_entry>:      stwu    r1,-32(r1)
0x2bd4 <acl_delete_entry+4>:    mflr    r0
0x2bd8 <acl_delete_entry+8>:    stw     r29,20(r1)
0x2bdc <acl_delete_entry+12>:   stw     r30,24(r1)
0x2be0 <acl_delete_entry+16>:   mr      r29,r4
0x2be4 <acl_delete_entry+20>:   li      r4,28972
RandomNickName42
источник