strace pwd
:
getcwd("/root"..., 4096) = 6
ltrace pwd
:
getcwd(NULL, 0) = "/root"
为什么NULL
中的第一个参数是ltrace
?
更新
似乎strace / ltrace都使用ptrace
系统调用,但为什么他们会得到不同的信息?
答案 0 :(得分:4)
是的,他们都使用ptrace
,并且他们也获得了不同的信息。这是因为它们以不同的方式使用ptrace
。
如果查看ptrace man page,您会看到存在多个“请求”值,这些值决定了ptrace的行为。
更具体地说,如果您使用ptrace
预先设置选项PTRACE_O_TRACESYSGOOD
,则可以区分导致系统调用的陷阱和不导致系统调用的陷阱。 / p>
答案 1 :(得分:3)
ltrace
显示了库调用。在这种情况下,它显示源代码正在调用的libc
函数。
如果你看到pwd
的来源,你会看到(coreutils-8.13,文件lib / xgetcwd.c):
char *cwd = getcwd (NULL, 0);
因此,ltrace
的输出正确:pwd
执行getcwd(NULL, 0)
。根据Linux手册页getcwd(3)
:
如果buf为NULL,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"
答案 2 :(得分:2)
因为系统调用和库调用不同。阅读getcwd函数的联机帮助页,您将看到它具有以下原型:
long getcwd(char *buf, unsigned long size);