【发布时间】:2013-01-01 13:25:35
【问题描述】:
我想修改一些系统调用以进行跟踪。具体来说,每当进行系统调用open 时,我都想打印一些消息。
我一直在寻找互联网和代码,我在kernel/goldfish/fs/ 目录中找到了open.c。而且这个文件里有很多功能。我怎么知道确切地调用了哪个函数。我本可以在所有这些函数中编写一些 printk 调用来找到它,但我也必须为其他系统调用这样做。
所以,我有几个问题,
1) 查找系统调用实现细节的最佳方法是什么?
2) 我正在使用内核 2.6.29 (goldfish-Android)。不同内核版本的系统调用实现是否不同?
3) strace 告诉我正在进行 msgget 、msgrecv 和 'SYS_24' 系统调用。我查看了Android/bionic/libc/SYSCALLS.txt 文件,但 msgget 不存在。
但是当我查看android/bionic/libc/kernel/arch-arm/asm/unistd.h 文件时,我可以在那里找到msgget。我不明白发生了什么,然后我怎样才能找到 msgget 的实现?
谢谢。
【问题讨论】:
-
StackOverflow 不是解决此类 Android 内部问题的好资源。 StackOverflow 主要用于解决与使用 SDK 构建应用程序相关的问题。如果您在这里没有得到答案,请前往 source.android.com,选择合适的 Google 群组,然后尝试在那里提问。
-
大多数 Linux 系统(Android 本质上是一个 Linux 系统)可以使用
ptrace捕获系统调用。你调查过那条路线吗? -
这就是 strace 正在做的事情。但是可能使用的 strace 二进制文件有一个错误的系统调用编号表(为不同的版本构建)。
-
msgget() 和 msgrecv() 是 System V IPC 功能,Android 不支持 System V IPC,因为设计人员认为它存在潜在的拒绝服务问题。这强烈表明您使用的 strace 没有完全正确的系统调用表,但是 strace 对 ptraces 所做的是一个很好的方法,因此您可能会考虑重建它,或者只是为感兴趣的函数(希望那些在其表中是正确的)
-
感谢 Googlegroup 和 ptrace 建议以及 msgget() 详细信息。我已经怀疑 strace 的输出了。
标签: android linux linux-kernel