非正统的linux内核和valgrind

时间:2012-02-22 20:50:55

标签: linux kernel valgrind

首先,如果我在错误的地方写这篇文章,请向我道歉。 我似乎无法找到一个valgrind用户论坛来发布这种性质的东西,因为这个地方看起来相当全面,我想我会尝试一下。

我在运行代码时需要使用一些非正统的Linux内核。 我不太了解内核,具体因为我没有写它。 无论出于何种原因,我的内核看起来像是扩展了默认的linux内核的syscall表。 似乎发生的情况是,在.ko文件的insmod上,当前的标准系统调用表被扩展,从看起来是333开始,到341,原始系统调用表被保存,并在.ko时恢复是吵闹的。 这些额外的系统调用似乎执行某种独特的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 gentoo构建的自定义内核 (出于所有意图和目的,在加载我的专有内核模块之前它是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在看到syscall 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);

1 个答案:

答案 0 :(得分:3)

基本上,您要解决此问题的唯一方法是修改valgrind以删除对与自定义​​系统调用冲突的系统调用的支持,并至少添加对自定义系统调用的最小支持。事实上,valgrind试图将自定义系统调用的参数解释为使用相同插槽的标准系统调用。

valgrind源代码树根目录中的README_MISSING_SYSCALL_OR_IOCTL文件是开始提供有关如何将系统调用包装器添加到valgrind的指导的最佳位置。

要回答有关valgrind论坛的问题,freenode上有mailing lists#valgrind个IRC频道。