2012-02-22 47 views
2

首先,讓我道歉,如果我寫錯了地方。 我似乎無法找到一個valgrind用戶論壇,在其中發佈這種性質的東西,並且由於這個地方似乎相當全面,我想我會試試看。非正統Linux內核和valgrind

我在運行我的代碼時需要使用一些非正統的Linux內核。 我不太瞭解內核,因爲我沒有寫它。 我的內核,無論出於何種原因,它看起來像擴展了默認的linux內核的syscall表。 似乎發生的事情是,在.m文件的insmod時,當前的標準系統調用表被擴展,從333開始,到341,原始系統調用表被保存,並在恢復。 ko是rmmoded。 這些額外的系統調用似乎與我運行的專有軟件 執行某種獨特的IPC通信。

當然,這似乎與valgrind玩地獄。

我想使用valgrind來檢查我的程序當然,但valgrind總是崩潰 即時我的應用程序執行系統調用。 下面是輸出從我的valgrind獲得,減去幾件事情我寧願

==26045== Thread 2: 
==26045== Syscall param preadv(vector) points to unaddressable byte(s) 
==26045== at 0x4000982: ??? (in /lib/ld-2.9.so) 
==26045== by 0x426C756: syscall (in /lib/libc-2.9.so) 
==26045== by 0x4037430: com_lock (coms.c:114) 


--23932-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting 
--23932-- si_code=1; Faulting address: 0x165; sp: 0x63a6dde4 

valgrind: the 'impossible' happened: 
    Killed by fatal signal 
==23932== at 0x3809D5E0: vgSysWrap_linux_sys_preadv_before (syswrap-linux.c:3413) 
==23932== by 0x380785CB: vgPlain_client_syscall (syswrap-main.c:1382) 
==23932== by 0x38076330: vgPlain_scheduler (scheduler.c:929) 
==23932== by 0x380A13E8: run_a_thread_NORETURN (syswrap-linux.c:98) 
==23932== by 0x380A1732: vgModuleLocal_start_thread_NORETURN (syswrap-linux.c:268) 
==23932== by 0x380A8AC8: ??? (in /usr/local/lib/valgrind/memcheck-x86-linux) 

遺憾的是,我不可能不使用這些額外的系統調用。 我面臨的挑戰是如何處理它們。

到目前爲止我所學到的是,我可以在valgrind中指定新的或定製的系統調用包裝。不幸的是,我不知道如何在系統調用地址在運行期間全部切換時解決這個問題。

如果任何人都有寫過valgrind系統調用封裝的系統調用的經驗,他們已經添加到他們內核的非標準(並知道如何告訴valgrind切換包裝),請回復一些細節,參考,任何東西。我真的很感激它。

我使用的valgrind 3.7,與G ++ 4.1.1和定製的內核內置關閉2.6.29巴布亞 (對於所有意圖和目的,這是2.6.29的Gentoo,直到我的專有內核模塊加載)

編輯:

自從我第一次發佈後,我發現了一些與此相關的更多事情。 看來,valgrind有一個名爲include/vki/vki-scnums-x86-linux.h的文件。 根據其中的註釋(valgrind 3.7.0這裏記得),它或多或少是2.6.9內核中asm-i386/unistd.h的剪切和粘貼。 在指令枚舉333處,定義__NR_preadv。 對我來說,valgrind會在它執行一個名爲my_ipc的系統調用時死亡,這是我的內核特有的一個系統調用,枚舉值不會超過333. 看起來valgrind被編譯的是一個系統調用映射錯誤,內核中實際發生了什麼。因此,系統調用封裝器valgrind會在它看到系統調用333無法真正處理系統調用333時嘗試調用,因爲函數調用簽名可能不匹配。

我認爲preadv看起來像...

preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); 

,從我所知道的,我的IPC調用看起來像

asmlinkage long my_ipc (uint, long, long, long, long, long); 
+0

它只是擴展表嗎?這可能是它覆蓋了一個條目,而當valgrind發出系統調用時,它不是它想要的那個(它看起來好像存在訪問不良) – 2012-02-23 01:50:08

+0

經過進一步檢查後,它重寫了一個條目。 – sbrett 2012-02-23 18:42:39

+0

這就是我的想法:) – 2012-02-23 20:45:50

回答

3

基本上你要解決這個問題的唯一方法是修改的valgrind刪除的系統調用與衝突支持您的自定義系統調用併爲自定義系統調用添加至少最小的支持。正如valgrind正在嘗試將自定義系統調用的參數解釋爲使用相同插槽的標準系統調用一樣。

valgrind源代碼樹根目錄中的README_MISSING_SYSCALL_OR_IOCTL文件是開始指導如何將系統調用包裝添加到valgrind的最佳位置。

要回答您關於valgrind論壇的問題,請在freenode上有mailing lists#valgrind IRC頻道。

+0

好的,所以我不得不直接構建valgrind並插入對我特定系統調用的支持吧?猜猜有沒有簡單的方法。我不確定是否有辦法讓兩組系統調用共存於一個valgrind構建中,但也許這太難了。我想我可以保留2個獨立的valgrind可執行文件。 – sbrett 2012-02-23 18:40:57

+0

它們不能共存,因爲系統調用純粹由一個數字標識,並且內核已添加自定義調用,該自定義調用使用與最近上游內核添加的新調用衝突的數字。所以valgrind無法知道你的機器上的系統調用333與通常情況不同。 – TomH 2012-02-23 18:43:43