首先,让我道歉,如果我写错了地方。 我似乎无法find一个valgrind用户论坛来发布这种性质的东西,因为这个地方似乎相当包容,我想我会试试看。
运行我的代码时,我需要使用一些非正统的Linux内核。 我不太了解内核,因为我没有写。 我的内核,无论什么原因,看起来像扩展了默认的Linux内核的系统调用表。 看起来会发生的是,在.ko文件的insmod下,当前的标准系统调用表被扩展,从333开始,到341,原来的系统调用表被保存,当.ko被碾压。 这些额外的系统调用似乎与我正在运行的专有软件执行某种独特的IPC通信。
当然,这似乎与valgrind玩地狱。
我想用valgrind来检查我的程序当然,但valgrind总是崩溃,我的应用程序执行系统调用的瞬间。 这里是我从valgrind得到的输出,减去我宁愿的一些事情
枚举内核驱动程序中的所有符号链接
Windows内核是否可以在用户模式下发生损坏
RT修补Linux内核的循环testing
分片的UDP数据包没有被应用程序接收
如果我知道Windows内核,我该怎么办?
==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中指定新的或定制的系统调用包装器。 不幸的是我不知道如何在系统调用地址在运行期间全部切换的时候closures它。
如果任何人有任何经验写入valgrind系统调用封装系统调用,他们已经添加到他们的内核是非标准的(并知道如何告诉valgrind切换包装)请回复一些细节,参考,任何东西。 我真的很感激。
我正在使用valgrind 3.7,g ++ 4.1.1和2.6.29 gentoo构build的定制内核(对于所有的意图和目的,gentoo是2.6.29,直到我的专有内核模块被加载)
编辑:
自从我第一次发布以来,我发现了一些与此有关的事情。 看来,valgrind有一个名为include / vki / vki-scnums-x86-linux.h的文件。 根据其中的注释(valgrind 3.7.0记得),它或多或less是2.6.9内核的asm-i386 / unistd.h的剪贴。 在指令枚举333处,定义了__NR_preadv。 对我来说,当它执行一个叫做my_ipc的系统调用时,valgrind就会死亡,这是一个我的内核特有的系统调用,在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);
DeviceIoControl返回意外的物理扇区大小
Linux内核中的Dentry和超级块结构之间的循环依赖关系
从Linux内核访问物理内存
eax在pt_regs结构中的位置是什么? 只有斧头是存在的
struct task_struct中的“on_cpu”字段和struct thread_info中的“cpu”字段的含义是什么?
基本上你要解决这个问题的唯一方法就是修改valgrind来删除系统调用的支持,这些系统调用与自定义系统调用冲突,并且为自定义系统调用添加至少最小的支持。 正如valgrind正在尝试将自定义系统调用的参数解释为使用相同插槽的标准系统调用一样。
valgrind源代码树根目录中的README_MISSING_SYSCALL_OR_IOCTL文件是开始指导如何将系统调用包装添加到valgrind的最佳位置。
要回答你关于valgrind讨论论坛的问题,有邮件列表 ,或者freenode上的#valgrind IRC频道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。