strace/ltrace 输出不一致的信息

发布于 2024-11-17 08:00:02 字数 331 浏览 2 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

关于从前 2024-11-24 08:00:02

是的,他们都使用 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 use ptrace 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 option PTRACE_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.

止于盛夏 2024-11-24 08:00:02

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 源代码(例如libc-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"

ltrace shows the library call. In this case, it shows the function from the libc that the source code is calling.

If you see pwd's source, you will see (coreutils-8.13, file lib/xgetcwd.c):

char *cwd = getcwd (NULL, 0);

So, ltrace's output is correct: pwd executes getcwd(NULL, 0). According to the Linux man page getcwd(3):

getcwd() allocates the buffer dynamically using malloc(3) if buf is NULL.

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 call getcwd(path, alloc_size), where path is the result of a previous malloc(), and alloc_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(NULL, 0 <unfinished ...>
SYS_getcwd("/root", 4096)                        = 6
<... getcwd resumed> )                           = "/root"
暖伴 2024-11-24 08:00:02

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

long getcwd(char *buf, unsigned long size);

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:

long getcwd(char *buf, unsigned long size);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文