20

Czy istnieje sposób na wywołanie funkcji w jądrze Linux? Wiem, że __ func __ zwraca nazwę funkcji, która jest wykonywana. Szukam funkcji, które pod nazwą „__ func __Wywołanie funkcji w jądrze Linuksa

+2

Muahahahaaa. Haha ... nie jest zdrowy. –

Odpowiedz

37

Można uzyskać rozmówcę z __builtin_return_address(0).

Dzwoniącego dzwoniącego jest __builtin_return_address(1) i tak dalej.

Jest to rozszerzenie GCC, udokumentowany gcc instrukcji: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Edit: Powinienem chyba podkreślić, że dostaje adres osoby dzwoniącej. Jeśli chcesz nazwę funkcji można wydrukować z %pS np:

printk("Caller is %pS\n", __builtin_return_address(0)); 

Jeśli nie chcesz go wydrukować, można użyć kallsyms_lookup() itp

+8

To imponująca jujitsu. –

+0

Czy potrzebujesz wskaźników ramki z włączoną obsługą? – Brad

+0

Tak, prawdopodobnie potrzebujesz wskaźników ramek. – mpe

4

, czy potrzebne są wskaźniki ramki zależy na łuku, IIRC. W przypadku architektury x86 z pewnością pragnie się w pełni wykorzystać te funkcje. Zauważmy również, że wstawianie może z tej przyczyny skosić dokładność wbudowanego adresu_wejścia.

Jeśli chcesz tylko zrzutu stosu, aby zobaczyć, jak pewne miejsce zostało osiągnięte, lepiej korzystać z funkcji dump_stack() niż próbować bawić się przy użyciu wbudowanego adresu_wejściowego.

5

Możesz także wydrukować całą zawartość stosu wywołań, wywołując dump_stack().

0

Aby uzyskać nazwę funkcji wywołującej, można użyć poniższego polecenia printk.

printk ("Wzywający to% pF \ n", __builtin_return_address (0));

Powiązane problemy