strace/ltrace 输出不一致的信息
strace pwd
:
getcwd("/root"..., 4096) = 6
ltrace pwd
:
getcwd(NULL, 0) = "/root"
为什么ltrace
中第一个参数是NULL
?
看起来 strace/ltrace 都使用 ptrace 系统调用,但为什么它们得到不同的信息?
strace pwd
:
getcwd("/root"..., 4096) = 6
ltrace pwd
:
getcwd(NULL, 0) = "/root"
Why the 1st parameter is NULL
in ltrace
?
It eems strace/ltrace both uses the ptrace
syscall,but why they get different info?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是的,他们都使用 ptrace,并且获得不同的信息。这是因为他们使用 ptrace 的方式不同。
如果您查看ptrace man page,您就会发现将看到存在多个“请求”值,它们决定 ptrace 的行为。
更具体地说,如果您使用 ptrace 预先设置了选项 PTRACE_O_TRACESYSGOOD ,您就可以区分导致系统调用的陷阱和不导致系统调用的陷阱。来电。
Right, they both use
ptrace
, and also they get different info. This is because they useptrace
differently.If you have a look at the ptrace man page, you will see that there exist several 'request' values, which decide the behaviour of ptrace.
More concretely, if you use
ptrace
to previously set the optionPTRACE_O_TRACESYSGOOD
, you have a way to distinguish between the traps leading to system calls and the traps that are not leading to system calls.ltrace
显示库调用。在本例中,它显示源代码正在调用的libc
中的函数。如果您查看
pwd
的源代码,您将看到(coreutils-8.13,文件lib/xgetcwd.c):因此,
ltrace
的输出是正确的:pwd
执行getcwd(NULL, 0)
。根据 Linux 手册页getcwd(3)
:但是,系统调用 getcwd(2) 始终需要一个不同于 NULL 的第一个参数,以便将路径名复制到那里。您可以在 libc 源代码(例如libc-3.13,文件 sysdeps/unix/sysv/linux/getcwd.c)中看到这是如何完成的。
库调用
getcwd(NULL, 0)
执行系统调用getcwd(path, alloc_size)
,其中path
是先前 malloc 的结果(),alloc_size
是页面大小 (4096)。为了确认这一点,如果您运行 ltrace -S pwd ,您将看到库调用和系统调用:您将看到类似以下内容:
ltrace
shows the library call. In this case, it shows the function from thelibc
that the source code is calling.If you see
pwd
's source, you will see (coreutils-8.13, file lib/xgetcwd.c):So,
ltrace
's output is correct:pwd
executesgetcwd(NULL, 0)
. According to the Linux man pagegetcwd(3)
:However, the system call
getcwd(2)
always needs a first argument different from NULL, to copy there the pathname. You can see how this is done in the libc source (eglibc-3.13, file sysdeps/unix/sysv/linux/getcwd.c).The library call
getcwd(NULL, 0)
executes the system callgetcwd(path, alloc_size)
, wherepath
is the result of a previous malloc(), andalloc_size
is the page size (4096).To confirm this, if you run
ltrace -S pwd
you will see both the library calls and the system calls: you will see something like:因为系统调用和库调用是不同的。阅读 getcwd 函数的联机帮助页,您将看到它具有以下原型:
Because the system call and the library call are different. Read the manpage for the getcwd function and you'll see that it has the following prototype: