我不知道如何调试这种情况:
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 下阻塞,我如何查看它的阻塞位置?
谢谢!
有没有办法附加到进程并找出它正在读取的文件,而且这些读取的读取位置(字节偏移量)是什么?
我尝试为此使用 strace ,但它似乎没有显示该信息。
我正在尝试测量正在运行的进程的磁盘 IO 延迟以制作直方图。
我可以在提供它的操作系统中使用 DTrace 做到这一点(例如在这篇 Joyent 论文中),但我的应用程序在 Linux 中运行。我的第一个想法是尝试perf,我可以得到计数器,但我找不到任何方法来获取时间增量。我可以使用strace(例如strace -e read -T)获取时间增量,但我不确定是否可以将跟踪限制为磁盘 IO(该系统也有一个繁忙的网络接口)。
有没有办法在 Linux 中做到这一点?
在第一个 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似乎没有什么意义。
所以最近,我和某人讨论了 strace,他们问如果你在创建一个网络套接字或类似的东西时 strace 一个正在运行的进程会发生什么。这会导致程序以意想不到的方式崩溃吗?
根据我对 ptrace(strace 使用的系统调用)的了解,如果您只是在调试线程,它不应该导致类似的事情。每次调用系统调用时,该进程都会停止,但它应该稍后恢复并且不会更明智。信号在未运行时排队,所以我假设 syscalls/sockets/listen 会发生类似的事情。
在 strace 上下文中使用的 ptrace 会导致任何奇怪的进程崩溃吗?
OK,所以这不是什么秘密,strace产生庞大的数量输出。(我知道有多种选项可以稍微过滤输出。)
是否有任何工具可以将原始strace日志处理为更易读的内容?
我在寻找什么样的“解码”?好吧,按设计strace在非常低的水平上工作。我正在寻找可以总结最重要观点的东西。例如,FD 4 可能在不同的时刻指向不同的文件;让机器而不是我来跟踪它会很有用。PID 也是如此。我希望能够在跟踪中的不同时刻看到进程树,等等。GUI 工具会很棒,但如果它使事情更容易理解,即使是基于文本的工具也是可以接受的。
注意:有几个类似的问题,一般的答案是“如果要跟踪多线程进程或跟踪子进程,请使用 -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) 由于某种原因,在 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) 有玩strace,这在我看来,ld.so.cache和libc.so.6打开和映射到内存,几乎每一个过程。至少我尝试过的那些过程。这不是说这些进程被多次映射到进程内存中吗?
当然,这些文件很小,但这不是有点浪费内存吗?
strace 输出显示这些正在使用MAP_PRIVATEset进行 mmap'ed ,这使得它在写时复制,但每个进程似乎仍然有一个新的映射。
我的问题:
我试图用来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 用户身份执行的命令?
strace ×10
linux ×3
shell ×2
autocomplete ×1
dtrace ×1
glibc ×1
kill ×1
mmap ×1
networking ×1
perf-event ×1
permissions ×1
posix ×1
sshfs ×1
sudo ×1