strace输出究竟是什么?

时间:2011-04-01 05:54:50

标签: strace

完全是我在这里关注的......

mmap(0x37aa74d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x37aa74d000

所有人都说strace会返回所有使用过的系统调用,但我grep entry.S并且只有sys_mmap而不仅仅是mmap,这意味着mmap不是系统调用,应该是{ {1}}。

那么完全是strace输出??

另一个问题是我认为sys_mmap表示返回值,对吧?但是如果函数没有返回类型怎么办?(= 0x37aa74d000)?

4 个答案:

答案 0 :(得分:3)

strace用户空间的角度生成系统调用的名称:mmapopenread,{{这将与libc包装器执行比仅陷入操作系统更复杂的函数调用时的函数调用不同。例如,如果您在代码中致电writesigaction会向您显示对strace的来电,因为多年来,rt_sigaction一直是最常见的系统调用用于设置信号动作,因此GNU libc根据该原语实现所有信号设置功能。 (在这种情况下,你不能直接调用rt_sigaction,因为glibc没有公开它的包装 - 我不知道为什么会这样。)

rt_sigaction是Linux内核中发生的函数的名称,它是sys_mmap系统调用的入口点。 Linus可以为系统调用入口点选择他想要的任何命名约定 - mmapmmapmach_mmap,无论如何 - 这是一个与用户空间无关的实现细节。因此ZwMmap不会向您显示这些名称。

返回类型为strace系统调用是终止进程的系统调用,例如void。 (从编程语言设计的角度来看,更准确地说它们没有返回类型,因为它们不返回。)exit_group打印出类似的这样:

strace

所有其他系统调用都会返回某些内容,因为所有这些调用至少在理论上都会失败,并且他们必须告诉您它们是否存在。如果除了成功/失败指示之外没有值返回它们,那么它们返回exit_group(0) = ? ,其成功为零或失败为int-1逐字打印。 [Soapbox:这是Unix中一个长期存在的设计错误,至少可以追溯到第一次实现NFS。资源释放原语 - straceclose等 - 应该是不可能的,并且它们的返回类型应该是munmap来表示。我有一个时间机器,我完全打算解决这个问题。]

答案 1 :(得分:2)

mmap(2)是系统调用sys_mmap周围的libc包装器。如果要分析库调用,请使用ltrace

mmap的返回类型是void*,这是一个非类型指针,它是成功映射后返回的内容。

答案 2 :(得分:1)

除了这里给出的优秀答案之外,值得强调的是人们常常混淆系统调用(直接向内核发出请求)和库调用(通常是指对GlibC函数的调用)。

许多GlibC调用与系统调用具有相同的名称(例如,读取,写入,打开等),并且只是它们调用的系统调用的包装器。其他的并不是那么简单,例如exec系列的GlibC函数都使用'execve'系统调用来执行一个程序,所以它们都会显示为对strace执行的调用。

通常当人们谈论系统调用时,他们实际上意味着库调用,他们使用的函数在strace输出中会有所不同。

答案 3 :(得分:0)

Strace正在打印系统调用,mmap不在其中,请检查man mmap

  

将文件或设备映射或取消映射到内存

这是它的定义:

  

void *mmap(void *addr, size_t lengthint " prot ", int " flags , int fd, off_t offset);int munmap(void *addr, size_t length);

,最后一个数字是返回值:

  

成功时,mmap()返回指向映射区域的指针。出错时,返回值MAP_FAILED(即(void *) -1),并正确设置errno。成功时,munmap()返回0,失败-1,并且设置了errno(可能为EINVAL)。

对于每个系统调用,您可以检查他们的man页面。要详细了解strace输出自我,请检查man strace