簡體   English   中英

如何在 Linux 中調試 FUSE 文件系統崩潰

[英]How to debug FUSE filesystem crash in Linux

目前我正在用 C 語言在 Linux(2.6 內核)中使用 FUSE 文件系統模塊開發一個應用程序。 由於一些編程錯誤,應用程序在掛載文件系統后崩潰。 由於我是 Linux/C 環境中的新手開發人員。 你能告訴我調試這些程序的可能選項嗎?

FUSE 有幾個特性會使調試變得困難:它通常在后台運行(這意味着它與 stdin/out 分離)並且是多線程的(這會引入競爭條件並且使用 gdb 調試更復雜)。 幸運的是,這兩個功能都可以禁用:

  1. 使用-f開關將您的應用程序保持在前台。 這將使您的 printf 行起作用。
  2. 使用-s開關禁用多線程。 禁用多線程會限制性能,但也會隱藏某些錯誤(競爭條件),簡化 gdb 的使用,並確保 printf 輸出可讀(當多個線程大約同時調用 printf 時,它們的輸出可能會混淆)。

我還建議閱讀 Geoff Kuenning 的FUSE 文檔

使用-d選項運行您的保險絲客戶端。

首先,確保您在編譯時啟用調試符號( gcc -g選項)。 在運行程序之前,使用 shell 命令啟用核心轉儲:

ulimit -c unlimited

然后當應用程序崩潰時,它會在當前工作目錄中留下一個core文件(只要它可以寫入)。

然后您可以在gdb調試器中加載核心文件:

gdb <executable file> <core file>

...它會告訴你它在哪里崩潰,並讓你檢查變量等等。

您可以將Valgrind與 FUSE 結合使用,但請先閱讀本文以了解 setuid 解決方法。 為了方便可能需要調試我的文件系統的其他人,我實際上做了以下操作:

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

我在 FUSE 上工作了很多 .. 90% 的時間我的崩潰是由於泄漏導致 OOM 殺手采取行動,取消引用一個壞指針,雙 free() 等。 Valgrind 是一個很好的工具來捕捉它. GDB 很有幫助,但我發現 Valgrind 是必不可少的。

UML 非常適合調試 linux 內核的通用部分,如文件系統、調度,但不適用於內核的硬件平台或驅動程序特定部分。

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

http://valerieaurora.org/uml_tips.html

並仔細查看圖表:

FUSE 文件系統的圖像結果

您將看到正在實現所有 FUSE 回調處理程序的應用程序“hello”。 所以大部分調試都是在用戶空間程序中進行的,因為 FUSE 內核模塊(和 libfuse)通常是由 ALL FUSE 文件系統使用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM