strace pwd
getcwd("/root"..., 4096) = 6ltrace pwd
getcwd(NULL, 0) = "/root"为什么在ltrace中第一个参数是NULL
它似乎strace/ltrace都使用ptrace系统调用,但为什么他们得到不同的信息?
发布于 2012-11-11 02:29:36
是的,他们都使用ptrace,而且他们得到的信息也不同。这是因为它们使用ptrace的方式不同。
如果你看一下ptrace man page,你会发现有几个‘Request值’,它们决定了ptrace的行为。
更具体地说,如果使用ptrace预先设置选项PTRACE_O_TRACESYSGOOD,则可以区分导致系统调用的陷阱和不导致系统调用的陷阱。
发布于 2014-08-13 20:26:12
ltrace显示了库调用。在本例中,它显示了源代码正在调用的libc中的函数。
如果你看到了pwd的源代码,你会看到(coreutils-8.13,file /xgetcwd.c):
char *cwd = getcwd (NULL, 0);因此,ltrace的输出是正确的:pwd执行getcwd(NULL, 0)。
如果buf为空,
getcwd()将使用malloc(3)动态分配缓冲区。
但是,系统调用getcwd(2)总是需要一个不同于NULL的第一个参数,以便将路径名复制到那里。您可以在libc源代码(eglibc-3.13,文件sysdeps/unix/sysv/linux/getcwd.c)中看到这是如何完成的。
库调用getcwd(NULL, 0)执行系统调用getcwd(path, alloc_size),其中path是前一个malloc()的结果,alloc_size是页面大小(4096)。
为了确认这一点,如果您运行ltrace -S pwd,您将看到库调用和系统调用:您将看到类似以下内容:
getcwd(NULL, 0 <unfinished ...>
SYS_getcwd("/root", 4096) = 6
<... getcwd resumed> ) = "/root"发布于 2011-06-23 20:28:40
因为系统调用和库调用是不同的。阅读getcwd函数的手册页,您将看到它具有以下原型:
long getcwd(char *buf, unsigned long size);https://stackoverflow.com/questions/6453850
复制相似问题