星期二, 3月 25, 2008

利用valgrind對用fuse所出的檔案系統進行memory leak除錯

如之前的文章說過,valgrind可以幫助程式設計者快速找出程式中會造成memory leak的部分。但是,如果你用fuse來進行user-level的檔案系統開發,並想利用valgrind來找出程式中memory leak的部分,馬上你就會發現一個問題,就是程式跑一下子後就會自動結束了。這時候你應該會看到螢幕上出現以下的錯誤訊息:

fuse: bad mount point `/mnt/storage': Transport endpoint is not connected

其實這不算是個錯誤,造成這個現象的主要原因是fuse的runtime librry會呼叫mount,進行檔案系統掛載的動作。但是因為mount這支程式本身是privileged program,必須要有root權限才可以執行此程式進行檔案系統掛載的動作,因此才會出現上面錯誤。

解決此問題最簡單的方式,就是將mount程式的setuid bit取消掉,也就是執行

chmod -s /bin/mount

如此一來,就可以使用valgrind來對用fuse所寫的檔案系統進行memory leak除錯的工作了。

當然,將mount的setuid bit取消掉會造成系統安全有疑慮。不過,也沒關係啦,只要記得在進行完debug的動作後,恢復mount程式的權限就可以了。

沒有留言: