首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strace/ltrace输出信息不一致

strace/ltrace输出信息不一致
EN

Stack Overflow用户
提问于 2011-06-23 20:18:07
回答 3查看 1.7K关注 0票数 4

strace pwd

代码语言:javascript
复制
getcwd("/root"..., 4096)                = 6

ltrace pwd

代码语言:javascript
复制
getcwd(NULL, 0)                                     = "/root"

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-11-11 02:29:36

是的,他们都使用ptrace,而且他们得到的信息也不同。这是因为它们使用ptrace的方式不同。

如果你看一下ptrace man page,你会发现有几个‘Request值’,它们决定了ptrace的行为。

更具体地说,如果使用ptrace预先设置选项PTRACE_O_TRACESYSGOOD,则可以区分导致系统调用的陷阱和不导致系统调用的陷阱。

票数 4
EN

Stack Overflow用户

发布于 2014-08-13 20:26:12

ltrace显示了库调用。在本例中,它显示了源代码正在调用的libc中的函数。

如果你看到了pwd的源代码,你会看到(coreutils-8.13,file /xgetcwd.c):

代码语言:javascript
复制
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,您将看到库调用和系统调用:您将看到类似以下内容:

代码语言:javascript
复制
getcwd(NULL, 0 <unfinished ...>
SYS_getcwd("/root", 4096)                        = 6
<... getcwd resumed> )                           = "/root"
票数 3
EN

Stack Overflow用户

发布于 2011-06-23 20:28:40

因为系统调用和库调用是不同的。阅读getcwd函数的手册页,您将看到它具有以下原型:

代码语言:javascript
复制
long getcwd(char *buf, unsigned long size);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6453850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档