2009-08-26 8 views
7

Próbuję zrozumieć, jak działa określona biblioteka. Przygotowałem go z dodanymi książkami i wszystko jest świetne. Teraz chcę zatrzymać przykładowy program w czasie wykonywania, aby spojrzeć na stos wywołań, ale nie jestem w stanie wymyślić, jak to zrobić z gdb. Funkcja, którą chcę włamać, znajduje się w udostępnionej bibliotece. Sprawdziłem previous question tutaj na SO, ale podejście to nie działa dla mnie. Dany język to C++. Podjęto próbę podania nazwy pliku i numeru linii, ale gdb nie chce tego zrozumieć, wyświetla jedynie pliki źródłowe z aplikacji demonstracyjnej.Debugowanie/śledzenie wewnątrz biblioteki współdzielonej w czasie wykonywania?

Wszelkie sugestie?

Odpowiedz

4

Najpierw możesz "złamać główną". Zanim to zrobisz, biblioteka współdzielona powinna zostać załadowana, a następnie możesz ustawić punkt przerwania w dowolnej z jej procedur.

+1

Tak, ale upewnij się, że skompilowany biblioteka z -g iz wyłączonymi optymalizacjami! – Alex

+0

Niestety to nie pomogło. Funkcja nadal nie jest widoczna, nawet z głównego. Czy jest coś, co mogę dodać do kodu, aby spowodować zatrzymanie wykonywania i wrzucenie do debuggera? – EightyEight

+0

@EightyEight: Hmm, to działa dla mnie. Czy biblioteka, którą próbujesz debugować, może być ładowana dynamicznie przez dlopen()? To może wyjaśnić, dlaczego nadal nie jest to widoczne. W takim przypadku możesz ustawić początkowy punkt przerwania po wywołaniu biblioteki dlopen dla biblioteki docelowej, a następnie ustawić ostateczny punkt przerwania. Wygląda na to, że powinien istnieć prostszy sposób; Będę dalej szukać. –

3

Istnieją dwa przypadki do rozważenia (i zapytanie nie jasno takim przypadku masz):
- plik wykonywalny jest związana z udostępnionej biblioteki bezpośrednio:
oznacza to, że GDB będzie „widzieć” symbole (i źródła) z udostępnionej biblioteki, kiedy przestać na głównym
- plik wykonywalny dynamicznie ładuje biblioteki współdzielonej (np poprzez dlopen):
w tym przypadku GDB nie „widzą” udostępnionego biblioteki aż po dlopen uzupełnia.

Ponieważ nie widzisz symboli, gdy zatrzymujesz się przy głównym, zgaduję, że masz drugi przypadek. Możesz zrobić "set stop-on-solib-events 1" po znaku zachęty (gdb), a GDB zatrzyma się za każdym razem, gdy nowa biblioteka współdzielona zostanie załadowana (lub wyładowana).

Możesz zobaczyć, które biblioteki "wiedzą" o poleceniu info shared.
Po prostu poczekaj, aż zobaczysz swoją bibliotekę docelową na tej liście, przed próbą ustawienia w niej punktów przerwania.

+0

To rozwiązanie nie będzie działać podczas debugowania aplikacji klienckiej Oracle SQLPlus –

1

to sprawdzić:

http://linux.die.net/man/1/ltrace

będzie prześledzić połączeń biblioteka - prawdopodobnie będzie przydatna.

I "strace" robi to samo dla wywołań systemowych.

A z tym powinno być możliwe, aby znaleźć punkt wejścia ... Można ustawić punkt przerwania w GDB w ten sposób (choć nie mogę wyjaśnić szczegóły ja)