Jak ustawić punkty przerwania w przyszłych bibliotekach współdzielonych za pomocą flagi polecenia

94

Próbuję zautomatyzować sesję gdb za pomocą --commandflagi. Próbuję ustawić punkt przerwania funkcji w bibliotece współdzielonej (odpowiednik biblioteki DLL w systemie Unix). Mój cmds.gdb wygląda następująco:

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

Jednak otrzymuję następujące informacje:

shlomi: ~ / progs / bugs-external / kde / font-breaking $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux wydanie 2009.0)
Copyright (C) 2008 Free Software Foundation, Inc.
Licencja GPLv3 +: GNU GPL w wersji 3 lub nowszej 
To jest wolne oprogramowanie: możesz je zmieniać i rozpowszechniać.
NIE MA GWARANCJI, w zakresie dozwolonym przez prawo. Wpisz „pokaż kopiowanie”
i „pokaż gwarancję”, aby uzyskać szczegółowe informacje.
Ten GDB został skonfigurowany jako „i586-mandriva-linux-gnu” ...
(nie znaleziono symboli debugowania)
Funkcja „IA__FcFontMatch” nie została zdefiniowana.
Oczekiwanie na punkt przerwania podczas przyszłego ładowania udostępnianej biblioteki? (y lub [n]) [odpowiedział N; wejście nie z terminala]

Więc w końcu nie ustawia punktu przerwania. Jak ustawić domyślną odpowiedź „y”, aby ustawić punkty przerwania w oczekiwaniu na przyszłe załadowanie biblioteki współdzielonej?

Pamiętam, że mogłem coś zrobić, ale nie pamiętam co.

Shlomi Fish
źródło

Odpowiedzi:

153

Odpowiadając sobie, chciałbym udzielić odpowiedzi, którą ktoś udzielił mi na IRC:

(gdb) apropos w toku
akcje - określ działania, które mają zostać podjęte w punkcie śledzenia
set breakpoint - ustawienia specyficzne dla punktu przerwania
set breakpoint pending - Ustaw zachowanie debugera dotyczące oczekujących punktów przerwania
show breakpoint - ustawienia specyficzne dla punktu przerwania
show breakpoint pending - Pokaż zachowanie debugera dotyczące oczekujących punktów przerwania

Tak więc ustawianie punktu przerwania w oczekiwaniu załatwia sprawę; jest używany cmds.gdbnp

set breakpoint pending on
break <source file name>:<line number>
Shlomi Fish
źródło
1
który uratował mój bekon podczas próby debugowania w Windows 7 przy użyciu MinGW, domyślne ustawienie było inne niż w Linuksie
wielkie
Z jakiegoś powodu otrzymuję ten błąd Program received signal SIGILL, Illegal instruction. Pobieram punkty przerwania z pliku i mam, set breakpoint pending onponieważ niektóre z moich punktów przerwania znajdują się w bibliotece ładowanej przez program. Jeśli dodam punkty przerwania ręcznie, nie ma błędu. Czy ktoś jeszcze ma podobny problem?
brokenfoot
@brokenfoot: Myślę, że powinieneś zadać swoje pytanie w nowym pytaniu na najwyższym poziomie, zamiast w komentarzu do odpowiedzi tutaj. W ten sposób więcej osób to zauważy. Ponadto powinieneś podać więcej informacji o swoim systemie.
Shlomi Fish
12

OT: W terminalu wyglądałoby tak, aby debugować Caja w jednej linii:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync
äxl
źródło
3
Gdzie znalazłeś przełącznik 'ex' ?, w dokumentacji nie mogę znaleźć żadnego odniesienia do tego parametru (ale działa :))
Gearoid Murphy
-exnie działa dla mnie. Musiałem umieścić polecenia w pliku tmp i zadzwonić z:gdb -x /tmp/gdb.commands myexecutible
Jasonem Moore
5

Bez symboli.

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
źródło