strace / ltrace输出不一致的信息

时间:2011-06-23 12:18:07

标签: strace ptrace ltrace re-engineering

strace pwd

getcwd("/root"..., 4096)                = 6

ltrace pwd

getcwd(NULL, 0)                                     = "/root"

为什么NULL中的第一个参数是ltrace

更新

似乎strace / ltrace都使用ptrace系统调用,但为什么他们会得到不同的信息?

3 个答案:

答案 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);