首先,讓我道歉,如果我寫錯了地方。 我似乎無法找到一個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);
它只是擴展表嗎?這可能是它覆蓋了一個條目,而當valgrind發出系統調用時,它不是它想要的那個(它看起來好像存在訪問不良) – 2012-02-23 01:50:08
經過進一步檢查後,它重寫了一個條目。 – sbrett 2012-02-23 18:42:39
這就是我的想法:) – 2012-02-23 20:45:50