标签: strace

ls 在 strace 下的行为不同

我不知道如何调试这种情况:

1)我尝试执行:

ls /home/user
Run Code Online (Sandbox Code Playgroud)

2) ls 阻止并且不打印任何内容。我认为这是因为 /home/user 包含 /home/user/sshfs_files,这是一个 sshfs 挂载目录,但我的机器上的网络出现故障(网络再次启动,但我猜 SSH 连接已丢失)。

3) 因为我想确定挂载的目录是 sshfs 的原因,所以我在 strace 下尝试了相同的命令:

strace -o /tmp/log ls /home/user
Run Code Online (Sandbox Code Playgroud)

4) ls 确实有效!所以现在的情况是 ls 在 strace 下工作但它自己阻塞。

怎么可能?如何解释这种情况?如果 ls 没有在 strace 下阻塞,我如何查看它的阻塞位置?

谢谢!

networking sshfs strace

7
推荐指数
1
解决办法
1210
查看次数

查找进程读取文件的位置

有没有办法附加到进程并找出它正在读取的文件,而且这些读取的读取位置(字节偏移量)是什么?

我尝试为此使用 strace ,但它似乎没有显示该信息。

linux shell strace

7
推荐指数
1
解决办法
771
查看次数

测量正在运行的进程的磁盘 IO 延迟

我正在尝试测量正在运行的进程的磁盘 IO 延迟以制作直方图。

我可以在提供它的操作系统中使用 DTrace 做到这一点(例如在这篇 Joyent 论文中),但我的应用程序在 Linux 中运行。我的第一个想法是尝试perf,我可以得到计数器,但我找不到任何方法来获取时间增量。我可以使用strace(例如strace -e read -T)获取时间增量,但我不确定是否可以将跟踪限制为磁盘 IO(该系统也有一个繁忙的网络接口)。

有没有办法在 Linux 中做到这一点?

linux perf-event strace dtrace

7
推荐指数
1
解决办法
8058
查看次数

为什么叫 brk(0)?

在第一个 shell 上,我tail不带参数运行命令。

在第二个 shell 上,我使用 strace 杀死第一个尾部来监视系统调用。

qdii@nomada ~ $ strace kill 1713
execve("/bin/kill", ["kill", "1713"], [/* 82 vars */]) = 0
brk(0)                                  = 0x2533000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9dacfe8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
Run Code Online (Sandbox Code Playgroud)

我不知道brk命令,所以我查了一下,发现它改变了进程的数据段的末尾。为什么kill要这样做?特别是将数据段设置为0似乎没有什么意义。

kill posix strace virtual-memory

7
推荐指数
1
解决办法
5081
查看次数

strace/ptrace 会导致程序崩溃吗?

所以最近,我和某人讨论了 strace,他们问如果你在创建一个网络套接字或类似的东西时 strace 一个正在运行的进程会发生什么。这会导致程序以意想不到的方式崩溃吗?

根据我对 ptrace(strace 使用的系统调用)的了解,如果您只是在调试线程,它不应该导致类似的事情。每次调用系统调用时,该进程都会停止,但它应该稍后恢复并且不会更明智。信号在未运行时排队,所以我假设 syscalls/sockets/listen 会发生类似的事情。

在 strace 上下文中使用的 ptrace 会导致任何奇怪的进程崩溃吗?

strace

7
推荐指数
1
解决办法
2684
查看次数

解码/汇总strace日志

OK,所以这不是什么秘密,strace产生庞大的数量输出。(我知道有多种选项可以稍微过滤输出。)

是否有任何工具可以将原始strace日志处理为更易读的内容?

我在寻找什么样的“解码”?好吧,按设计strace在非常低的水平上工作。我正在寻找可以总结最重要观点的东西。例如,FD 4 可能在不同的时刻指向不同的文件;让机器而不是我来跟踪它会很有用。PID 也是如此。我希望能够在跟踪中的不同时刻看到进程树,等等。GUI 工具会很棒,但如果它使事情更容易理解,即使是基于文本的工具也是可以接受的。

strace

7
推荐指数
1
解决办法
3775
查看次数

即使使用 -f(多线程父进程),Linux strace 也不跟随子进程

注意:有几个类似的问题,一般的答案是“如果要跟踪多线程进程或跟踪子进程,请使用 -f”。这对我没有帮助,因为我已经在使用 -f 了。

我需要跟踪一个 java 应用程序,它会定期启动一个子进程并执行一个脚本。我想查看提供给脚本的命令行参数,由于太复杂无法在这里解释的原因,我无法在脚本周围放置包装器。

我的问题是,跟踪 java 进程,我可以看到clone()系统调用,但我看不到clone().

这是一个最小的测试程序:

package exectest;
import java.io.IOException;
public class Exectest {
    public static void main(String[] args) {
        for (;;) {
            createProcess();
            try {
                Thread.sleep(15000);
            } catch (InterruptedException ex) {
                ;
            }
        }
    }
    static void createProcess()  {
        String[] params;
        params=new String[100000];
        for (int i=0; i<100000; i++) {
            params[i]=Integer.toString(i);
        }
        params[0]="echo";
        params[1]="test";
        try {
            Runtime.getRuntime().exec(params);
        } catch (IOException ex) {
            ;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行它并开始跟踪,产生:

# /path/to/java -version
java …
Run Code Online (Sandbox Code Playgroud)

linux strace

7
推荐指数
0
解决办法
5939
查看次数

Linux for Windows 中的自动完成速度非常慢

由于某种原因,在 WSL 中自动完成对我来说非常慢,它总是需要几秒钟的时间来显示结果(例如ll ~/Te<tab>,在 2-3 秒后打印ll ~/Temp)。

set -x我尝试使用and查找原因,strace但看不出问题是什么。

(参见set -x下面的输出)它停在该行+ [[ ~/Te == \$* ]],然后再次停在+ xspec=

使用 时strace,它会在clone线路处暂停,并且实际上显示在这些线路处花费了大约 1.4 秒。

知道可能是什么问题吗?

设置-x

+ _init_completion -s
+ local exclude= flag outx errx inx OPTIND=1
+ getopts n:e:o:i:s flag -s
+ case $flag in
+ split=false
+ exclude+==
+ getopts n:e:o:i:s flag -s
+ COMPREPLY=()
+ local 'redir=@(?([0-9])<|?([0-9&])>?(>)|>&)'
+ _get_comp_words_by_ref -n '=<>&' cur prev words …
Run Code Online (Sandbox Code Playgroud)

shell autocomplete strace windows-subsystem-for-linux

7
推荐指数
2
解决办法
4050
查看次数

ld.so.cache 和 libc.so.6 内存映射为每次调用?

有玩strace,这在我看来,ld.so.cachelibc.so.6打开和映射到内存,几乎每一个过程。至少我尝试过的那些过程。这不是说这些进程被多次映射到进程内存中吗?

当然,这些文件很小,但这不是有点浪费内存吗?

strace 输出显示这些正在使用MAP_PRIVATEset进行 mmap'ed ,这使得它在写时复制,但每个进程似乎仍然有一个新的映射。

我的问题:

  1. 我是否正确理解正在发生的事情?也就是说,是否真的有这些文件的新副本映射到需要它们的每个进程(似乎是每个进程)的内存中?
  2. 是否存在某种类型的内存共享?也就是说,由于映射是写时复制,是否有很多进程查看相同的物理内存位置?

glibc mmap strace

7
推荐指数
1
解决办法
594
查看次数

如何在以特定非 root 用户身份执行的命令上使用 strace?

我试图用来strace观察某个进程在哪里搜索文件。此过程搜索的位置将根据用户及其独特的环境变量而有所不同。但是,strace需要 root 权限才能运行,当我运行时:

sudo strace mycommand 
Run Code Online (Sandbox Code Playgroud)

mycommand似乎在 root 用户的上下文中执行,并且搜索到的位置不适用于当前用户。

以下使 mycommand 在用户(名为“user”)上下文中执行的尝试未成功:

sudo strace su user -c "mycommand"

sudo strace su -u user mycommand
Run Code Online (Sandbox Code Playgroud)

如何使用strace以特定的非 root 用户身份执行的命令?

permissions sudo strace

7
推荐指数
1
解决办法
4781
查看次数