您可以将SystemTap用于此类事情。
首先,设置您的系统。您需要 SystemTap、与您正在运行的内核相对应的头文件以及相同的调试符号。在 Debian 上,让它工作类似于:
sudo apt-get install systemtap
sudo apt-get install linux-headers-$(uname -r)
sudo apt-get install linux-image-$(uname -r)-dbg
Run Code Online (Sandbox Code Playgroud)
让它工作可能有点棘手,因为内核头文件和符号需要与您正在运行的内核完全匹配。希望它在 Gentoo 上很简单。
然后,将此文件另存为mmap.stp:
#! /usr/bin/env stap
# -*- systemtap -*-
global last_args
probe syscall.mmap2 {
last_args[tid()] = argstr;
}
probe syscall.mmap2.return {
errno = errno_p(returnval())
if (errno != 0) {
printf("%s[%d] mmap2(%s) failed: %d (%s)\n",
execname(), pid(), last_args[tid()],
errno, errno_str(errno));
}
}
probe begin {
printf("begin\n");
}
probe end {
printf("end\n");
}
Run Code Online (Sandbox Code Playgroud)运行它
sudo stap mmap.stp
Run Code Online (Sandbox Code Playgroud)编译并打印后begin,它将监视每个mmap()系统调用并保存其参数。如果发生错误,您将获得包含程序名称、进程 ID、参数和错误代码的输出。例如,运行这个无意义的程序:
int main() {
mmap(1,-1,123,0,1,0);
}
Run Code Online (Sandbox Code Playgroud)
给出 SystemTap 输出:
test[9601] mmap2(0x1, 4294967295, PROT_READ|PROT_WRITE|PROT_SEM|0x70, 0x0, 1, 0) failed: 22 (EINVAL)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10336 次 |
| 最近记录: |