2009-12-09 8 views
10

Obecnie opracowuję aplikację wykorzystującą moduł FUSE w Linuksie (jądro 2.6) w języku C. Z powodu błędu programowania aplikacja ulega awarii po zamontowaniu systemu plików. Ponieważ jestem początkującym programistą w środowisku Linux/C. Czy mógłbyś mi powiedzieć, jakie są możliwe opcje debugowania takich programów?Jak zdebugować awarię systemu plików FUSE w Linuksie

+0

Co to znaczy "używać"? Czy próbujesz wdrożyć system plików przestrzeni użycia w oparciu o mechanizm bezpieczników lub coś innego? –

+4

+1 - BEZPIECZNIK może być trochę trudny do debugowania. –

+0

@Sarsane, tak Wdrażam system plików przestrzeni użytkownika oparty na FUSE. – Hrishi

Odpowiedz

6

Po pierwsze, upewnij się, że kompilujesz z włączonymi symbolami debugowania (-g opcja na gcc). Przed uruchomieniem programu należy włączyć rdzeń zrzuca z poleceniem powłoki:

ulimit -c unlimited 

Potem, gdy awarii aplikacji, będzie to pozostawić plik core w bieżącym katalogu roboczym (tak długo, jak to może napisać do niego).

Następnie można załadować plik core w gdb debuggera:

gdb <executable file> <core file> 

... i będzie to pokazać, gdzie rozbił się i pozwalają badać zmienne i tak dalej.

2

Możesz użyć Valgrind z BEZPIECZNIKIEM, jednak read this first, aby dowiedzieć się o obejściu setuid. I rzeczywiście wykonać następujące czynności jako udogodnienie dla innych, którzy mogą potrzebować do debugowania mój system plików:

#include <valgrind/valgrind.h> 

if (RUNNING_ON_VALGRIND) { 
    fprintf(stderr, 
     "******** Valgrind has been detected by %s\n" 
     "******** If you have difficulties getting %s to work under" 
     " Valgrind,\n" 
     "******** see the following thread:\n" 
     "******** http://www.nabble.com/valgrind-and-fuse-file-systems" 
     "-td13112112.html\n" 
     "******** Sleeping for 5 seconds so this doesn't fly by ....", 
      progname, progname); 
    sleep(5); 
    fprintf(stderr, "\n"); 
} 

Pracuję na Bezpiecznik A partii .. i 90% czasu moje awarie spowodowane są nieszczelności, które powoduje, że OOM zabójca do działania, dereferencji złego wskaźnika, podwójny free(), itp. Valgrind jest doskonałym narzędziem do złapania tego. GDB jest pomocny, ale uznałem, że Valgrind jest nieodzowny.

+0

Ten link jest uszkodzony –

+0

Ale to działa: http://thread.gmane.org/gmane.comp.file-systems.fuse.devel/5224 –

6

Uruchomić klienta bezpiecznika za pomocą opcji -d.

8

Wiem, że to pytanie jest dość stare, ale jeśli użyjesz przełącznika -f, będzie on działał na pierwszym planie, co jest bardzo pomocne przy debugowaniu. Przełącznik -s wyłącza wielowątkowość, co jest bardzo przydatne.

Jestem obecnie opracowanie sterownik bezpiecznik i ta strona jest bardzo pomocne: http://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html

Cytując:

printf Twój printf/fprintf debugowanie kodu będzie działać tylko wtedy, gdy prowadzony z - przełącznik f. W przeciwnym razie bezpiecznik odłącza stdout i stderr.

+0

Dziękuję za wskaźnik. O ile widzę, jest to najbardziej przydatna odpowiedź. –

0

UML jest bardzo dobry do debugowania ogólnych części jądra systemu Linux, planowania, ale nie do platformy sprzętowej ani do specyficznej dla sterowników części jądra.

http://www.csee.wvu.edu/~katta/uml/x475.html

http://valerieaurora.org/uml_tips.html

I patrząc na wykres uważnie:

Image result for FUSE filesystem

Zobaczysz aplikację "Hello", który jest wykonanie wszystkich procedur obsługi FUSE zwrotnych. Dlatego większość debugowania znajduje się w programie użytkownika, ponieważ moduł jądra FUSE (i libfuse) jest ogólnie przeznaczony do użycia przez system plików ALL FUSE.

Powiązane problemy