标签: strace

在特定时间段内运行 strace

如何在特定时间段内(例如 1 分钟)在用户进程上运行 strace,而不终止用户进程且不使用 Ctrl+C?

我想创建一个脚本来自动执行用户进程的 strace。

strace

11
推荐指数
1
解决办法
6808
查看次数

为什么`strace` 不显示这个进程正在等待什么?

强者strace让我失望。这怎么可能?


time foo显示foo需要几秒钟才能运行(“真实”),但在用户空间(“用户”)和内核(“系统”)中使用的 CPU 时间可以忽略不计。对于好奇,foo定义如下。

所以它大部分时间都在等待其他东西,而不是执行 CPU 指令。通常,我可以看到它是如何等待的strace——即长时间阻塞的系统调用。不幸的是,这种方法不起作用。

strace -ttt -T -C -w foo显示系统调用、时间戳以及在系统调用中花费的(实际)时间的摘要。但是这个特定的过程显示在系统调用中花费的整体(真实)时间可以忽略不计。


foo实际上是journalctl -b -u dev-hugepages.mount。除了我每次都必须将最后一个参数更改为不同的 systemd 单元才能重现这一点。换句话说,我正在调查的延迟发生在我第一次尝试获取任何一个 systemd 单元的日志时。 编辑:回答主要问题后,我也意识到我遇到这个问题的原因重现了 delay

此过程所花费的时间是一个特定问题,显然并非在所有系统上都会发生。https://github.com/systemd/systemd/issues/7963

performance time strace

11
推荐指数
1
解决办法
1711
查看次数

Bash 尝试编写两个 shell 提示?

出于教育目的,我正在查看连接到终端的正在运行的 bash 进程的 strace 输出。

我的 bash 进程的 PID 为 2883。

我打字

[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Run Code Online (Sandbox Code Playgroud)

进入一个终端。然后我进入我的 bash 进程,并进行以下交互:

[OP@localhost ~]$ ls
Run Code Online (Sandbox Code Playgroud)

查看输出,我看到

strace: Process 2883 attached
read(0, "l", 1)                         = 1
write(2, "l", 1)                        = 1
read(0, "s", 1)                         = 1
write(2, "s", 1)                        = 1
read(0, "\r", 1)                        = 1
write(2, "\n", 1)                       = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) …
Run Code Online (Sandbox Code Playgroud)

bash tty strace

11
推荐指数
1
解决办法
945
查看次数

在显示系统调用中花费的时间时,strace 使用的时间单位是什么?

使用strace带有标志的命令时-T,我想知道用于显示系统调用时间的时间单位是什么?我认为它应该在几秒钟内,但我不太确定,手册中似乎省略了它。

linux process system-calls strace syscalls

10
推荐指数
3
解决办法
4363
查看次数

我可以跳过 strace 中动态加载器进行的系统调用吗?

当我strace检查程序时,我经常很难找到动态加载程序的系统调用在哪里结束以及程序的系统调用在哪里开始。

strace ./hello一个简单的 hello world C 程序的输出hello有 36 行。这是一个示例:

execve("./hello", ["./hello"], 0x7fffb38f4a30 /* 73 vars */) = 0
brk(NULL)                               = 0x1304000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe6715fe60) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=92340, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 92340, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f78d9fbd000
close(3)                                = 0
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260|\2\0\0\0\0\0"..., 832) = 832 …
Run Code Online (Sandbox Code Playgroud)

linux elf strace

10
推荐指数
1
解决办法
844
查看次数

运行 strace 如何解决我的 OpenGL 问题?

自从最近对我的发行版 (PLD Linux) 进行重大升级以来,我一直在处理大量程序时遇到问题。据我所知,任何涉及 OpenGL 或 PulseAudio 段错误的内容。我正在使用专有的 nvidia 驱动程序和 3.2.x 内核。Xorg 本身运行良好,我能够运行大多数程序,但是诸如 mplayer segfault 之类的东西,任何程序都不会产生声音。

一旦我发现它可能与 OpenGL 相关,我就开始glxgears尝试使用它。自行运行它会立即出现段错误。然后我发现在下运行它strace运行良好。同样的事情也适用于mplayer。立即在测试 mp3 文件段错误上运行它,运行strace mplayer播放效果很好(尽管脉冲音频仍然消失并且它恢复为虚拟输出设备)。

如何运行某些东西来strace防止它出现段错误,我将如何继续调试这种情况?

opengl segmentation-fault strace

8
推荐指数
1
解决办法
1736
查看次数

如何“跟踪”一个unix域套接字?

有点难以解释,但我注意到在strace打开套接字的 PID时我看不到任何通信。如何坐在套接字文件的中间观看通信?

socket strace linux-kernel

8
推荐指数
1
解决办法
2万
查看次数

如何确定进程正在执行哪些指令?

我知道 strace 和 ltrace,但这只能分别告诉我进程正在执行哪些系统调用和库调用。我想确切地知道进程正在执行哪些指令。如果可能的话,要么是汇编,要么是 C 和汇编之间的某种中间立场。假设二进制文件没有用调试符号编译,所以更有可能倾向于第一个选项。

用例:进程似乎挂起,strace 或 ltrace 没有输出。确定进程是否正在做“某事”。我意识到这可能很难确定,因为我认为这类似于解决停机问题。但是,有可能收集有用的数据。

第二个用例:好奇心。将整个汇编指令列表转储到文本列表会很有趣。

我的猜测是我可以使用 gdb 来做到这一点,但不确定如何,因为这不是关于调试我编写的程序,而是关于使用 gdb 检查正在运行的进程的健康状况。

操作系统是 CentOS 6。

process debugging gdb strace ltrace

8
推荐指数
2
解决办法
2790
查看次数

为什么strace 忽略我的rm 别名?

alias有一套我的rm命令。如果我运行alias命令,这就是我得到的输出。

alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

现在,当我运行rm命令时,它按预期工作正常。

rm ramesh
rm: remove regular empty file `ramesh'? y
Run Code Online (Sandbox Code Playgroud)

现在,我正在学习执行命令时正在调用的系统调用。为此,我strace这里了解了命令,该命令列出了我执行某些命令时正在调用的文件。命令如下。

strace -ff -e trace=file rm ramesh 2>&1 
Run Code Online (Sandbox Code Playgroud)

该命令工作得很好,只是它忽略了我为rm命令设置的别名。它会在不提示用户的情况下删除文件。

那么,strace像这样忽略别名吗?如果是这样,为什么会这样?

编辑:

不确定,如果这有什么关系,但type -a rm给我的输出是,

rm is aliased to `rm -i'
rm is /bin/rm
Run Code Online (Sandbox Code Playgroud)

那么/bin/rm在这种情况下是否考虑这就是为什么在删除之前不提示用户?

alias strace

8
推荐指数
3
解决办法
1318
查看次数

为什么在简单的 bash 命令中没有明显的 clone 或 fork 以及它是如何完成的?

考虑以下(含sh/bin/dash):

$ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcc8b661810) = 24865
wait4(-1, /proc/self/status:Pid:    24865
/proc/24864/status:Pid: 24864
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24865
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24865, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)

没有什么不寻常的,从主 shell 进程中grep替换了一个分叉进程(这里是通过 完成的clone())。到现在为止还挺好。

现在使用 bash 4.4: …

shell strace syscalls

8
推荐指数
2
解决办法
2182
查看次数