2009-12-09 60 views
10

Hiện tại tôi đang phát triển một ứng dụng sử dụng mô-đun hệ thống tệp FUSE trong Linux (2.6 Kernel) bằng ngôn ngữ C. Do một số lỗi lập trình, ứng dụng bị treo sau khi gắn hệ thống tệp. Vì tôi là một lập trình viên mới làm quen trong môi trường Linux/C. Bạn có thể vui lòng cho tôi biết tôi có thể tùy chọn gỡ lỗi các chương trình như vậy không?Cách gỡ lỗi hệ thống tệp FUSE trong Linux

+0

Ý bạn là "đang sử dụng"? Bạn có thử triển khai hệ thống tệp không gian sử dụng dựa trên cơ chế cầu chì hay cái gì khác không? –

+4

+1 - Cầu chì có thể hơi khó khăn để gỡ lỗi. –

+0

@arsane, vâng tôi đang triển khai hệ thống tệp không gian người dùng dựa trên FUSE. – Hrishi

Trả lời

6

Trước tiên, hãy đảm bảo bạn đang biên dịch với các biểu tượng gỡ lỗi được bật (-g tùy chọn gcc). Trước khi bạn chạy chương trình của bạn, cho phép lõi bãi với lệnh shell:

ulimit -c unlimited 

Sau đó, khi ứng dụng bị treo, nó sẽ để lại một file core trong thư mục làm việc hiện tại (miễn là nó có thể viết thư cho nó).

Sau đó bạn có thể tải các tập tin cốt lõi trong debugger gdb:

gdb <executable file> <core file> 

... và nó sẽ cho bạn thấy nơi nó bị rơi, và cho phép bạn kiểm tra các biến và vân vân.

2

Bạn có thể sử dụng Valgrind với FUSE, tuy nhiên read this first để tìm hiểu về công việc xung quanh. Tôi thực sự làm như sau như là một tiện nghi cho những người khác có thể cần phải gỡ lỗi hệ thống tập tin của tôi:

#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"); 
} 

tôi làm việc trên FUSE rất nhiều .. và 90% thời gian treo của tôi là do rò rỉ gây ra sự OOM kẻ giết người để hành động, dereferencing một con trỏ xấu, đôi miễn phí(), vv Valgrind là một công cụ tuyệt vời để nắm bắt điều đó. GDB là hữu ích, nhưng tôi đã tìm thấy Valgrind là không thể thiếu.

+0

Liên kết đó bị hỏng –

+0

Nhưng hoạt động này: http://thread.gmane.org/gmane.comp.file-systems.fuse.devel/5224 –

6

Chạy ứng dụng khách cầu chì của bạn với tùy chọn -d.

8

Tôi biết câu hỏi này khá cũ, nhưng nếu bạn sử dụng công tắc -f nó sẽ chạy ở nền trước, rất hữu ích để gỡ lỗi. Công tắc -s vô hiệu hóa đa luồng, cũng rất hữu ích.

Tôi hiện đang phát triển một trình điều khiển FUSE và trang này đã rất hữu ích: http://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html

Để báo:

printf mã gỡ lỗi printf/fprintf của bạn sẽ chỉ làm việc nếu bạn chạy với - f chuyển đổi. Nếu không, cầu chì sẽ ngắt kết nối stdout và stderr.

+0

Cảm ơn bạn đã chọn con trỏ. Theo như tôi thấy, đây là câu trả lời hữu ích nhất. –

0

UML rất tốt để gỡ lỗi các phần chung của hạt nhân Linux như hệ thống tệp, lập lịch nhưng không phải nền tảng phần cứng hoặc trình điều khiển phần cụ thể của hạt nhân.

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

http://valerieaurora.org/uml_tips.html

Và nhìn vào biểu đồ một cách cẩn thận:

Image result for FUSE filesystem

Bạn sẽ thấy các ứng dụng "hello" được thực hiện tất cả các bộ xử lý FUSE gọi lại. Vì vậy, đa số gỡ lỗi là trong chương trình không gian người dùng, như mô-đun hạt nhân FUSE (và libfuse) là nói chung có nghĩa là để được sử dụng bởi hệ thống tập tin ALL FUSE.

Các vấn đề liên quan