从debian lenny 升级到squeeze(apache2 2.2.16-6+squeeze4 和php 5.3.10-1~dotdeb.1)后,我的apache 进程开始因分段错误退出。它每 5-30 分钟发生一次(对于 1 个进程),因此它现在不会产生任何影响。问题是,有时不是用 退出SIGSEGV,而是发疯并以 100% 的系统 CPU 使用率SIGBUS错误地循环:
# strace -p27635 附加进程 27635 - 中断退出 --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) ---
他们不回应kill -9。但是当我在杀死它后在进程上运行 strace 时,它只是重复SIGBUS两次然后退出。
# strace -p27635 附加进程 27635 - 中断退出 --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 …
据我了解,time将记录在系统调用中花费的总时间。然后,我会期望SYS时间累计总量所报告的time和strace -fc是相同的。但它们大不相同(13.5 vs 0.005)。怎么了?
# time php index.php >/dev/null
real 0m16.292s
user 0m2.728s
sys 0m13.548s
# strace -fc php index.php >/dev/null
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
83.72 0.000365 0 54845 munmap
10.09 0.000044 0 36705 mmap
6.19 0.000027 0 18249 madvise
0.00 0.000000 0 289 read
0.00 0.000000 0 119 write
0.00 0.000000 0 118 3 open
0.00 0.000000 0 118 close
0.00 0.000000 0 23 …Run Code Online (Sandbox Code Playgroud) 我可以运行strace类似的命令sleep 1
并查看它正在访问哪些文件,如下所示:
strace -e trace=file -o strace.log sleep 1
Run Code Online (Sandbox Code Playgroud)
然而,在我的机器上,许多调用的返回值为-1,表明该文件不存在。例如:
$ grep '= -1 ENOENT' strace.log | head
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file …Run Code Online (Sandbox Code Playgroud) 有没有办法解决观察到的系统调用的数量:
SYS_345(0xe, 0xbff94188, 0x2, 0x4000, 0xb6526000) = 2
Run Code Online (Sandbox Code Playgroud)
在正在运行的内核中使用它的符号名称而不在源代码中查找它?
编辑用例是一个过时的strace二进制文件,位于外部框上,其内核源代码检索起来可能很乏味。
我目前对此很着迷,strace因为是新手,所以我决定稍微玩一下。正如问题标题所建议的那样,我尝试了strace su和strace ssh。这两个命令都显示了我在 strace 输出中输入的密码。su一直抱怨密码不正确,同时ssh设法正常登录。
我的问题:
su将错误的密码报告为一种安全措施,因为它检测到它正在运行strace?如果是这样,它怎么知道它是通过 调用的strace?它会检查/proc/self/cmdline吗?alias su="strace -o /tmp/output.log su"我有一个假设的情况:
假设我们有两个 strace 进程 S1 和 S2,它们只是相互监视。
这怎么可能?
好吧,在 strace 的命令行选项中,-p PID是传递所需 PID 的方式,当我们发出 strace 命令时,它(在我们的例子中)还不知道。我们可以更改 strace 源代码,这-P 0意味着向用户询问 PID。例如,来自 STDIN 的 read()。当我们可以在两个 shell 会话中运行两个 strace 进程并在第三个 shell 中找到 PID 时,我们可以将该输入提供给 S1 和 S2 并让它们相互监视。
S1 和 S2 会卡住吗?或者,进入无限循环,或立即崩溃或...?
再一次,假设我们有另一个 strace 进程 S3,使用-p -1,通过修改源代码,我们用它来告诉 S3 监视自己。例如,使用 getpid() 而不使用 STDIN。
S3会崩溃吗?或者,它会挂起而无法进一步处理吗?它会等待某个事件发生,但是,因为它在等待,所以不会发生任何事件吗?
在 strace 手册页中,它说我们无法监视 init 进程。是否有任何其他限制由 strace 或内核强制执行,以避免循环依赖或循环?
一些特殊情况:
S4 监控 S5,S5 监控 S6,S6 监控 S4。
S7 和 S8 相互监视,其中 S7 是 S8 的父级。 …
当我make在构建目录中运行以下命令时,它几乎是空的(有问题的文件绝对不存在)
strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>
完成后,文件就完全存在了。因此,它必须make是由其子进程(或它们的子进程的子进程等)或其中一个子进程创建的。
但是,当我strace为文件名或 forcreat我查找日志时,找不到负责创建此文件的系统调用。
我错过了什么?我应该监视其他系统调用吗?
事实证明,错误出在我的 strace 命令和我的 grepping 中。所有的答案都很有帮助,谢谢大家的时间。
我实际上没有传达该文件在子目录中的信息,并且我正在使用文件名和子目录的名称进行搜索。但是由于 strace 不提供有关当前工作目录的信息,因此这种方法效果不佳(我最终通过 stracechdir和rename调用来获得所需的效果)。
因此,PaulHaldane 的第一个建议是正确且切中要害的。以及 larsks 的回答,其中他实际上已经猜到了文件是如何创建的。
我猜想Linux 上的 SQL Server 正在检查/proc/self/status,TracerPID如果不是,则停止运行0。我想测试一下。玩玩,这是 strace,
... lots of stuff
openat(AT_FDCWD, "/proc/self/status", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(5, "Name:\tsqlservr\nUmask:\t0022\nState"..., 1024) = 1024
close(5) = 0
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
getpid() = 28046
gettid() = 28046
tgkill(28046, 28046, SIGABRT) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=28046, si_uid=999} ---
gettid() = 28046
write(2, "Dump collecting thread …Run Code Online (Sandbox Code Playgroud) 我有一台使用 Arch Linux 和 Ubuntu (16.04) 双重启动的机器。
我最近开始使用Kakoune 文本编辑器,并注意到它的启动时间根据我使用的操作系统而有很大不同。但我相信根本问题并不是由kakoune 直接造成的。
启动时,kakoune 运行一堆 shell 脚本,以启用与 x11 和 tmux、git、语法突出显示/颜色方案等的集成。可以禁用此功能,以便仅使用标志加载“vanilla”编辑器-n。
命令:kak -e q将启动 kakoune,运行所有启动脚本并立即退出。
在 Arch 上:
time kak -e q需要1 秒
time kak -n -e q(无 shell 脚本),不到20 毫秒即可完成。
在 Ubuntu 上:
time kak -e q大约需要450 毫秒
time kak -n -e q,再次低于20 毫秒
在削减脂肪并删除一些启动脚本之后,我确实看到两个操作系统的改进与删除的数量成比例。
我使用UnixBench运行了一些基准测试,发现两个系统之间的主要差异体现在“进程创建”和“shell 脚本”测试中。
shell 脚本测试测量进程每分钟可以启动并获取 shell 脚本的一组(一个、两个、四个和八个并发副本)的次数,其中 shell 脚本对数据文件应用一系列转换。
这是相关的输出。“每秒循环次数”的单位越多越好: …
performance system-programming shell-script strace benchmark
我为 sys_enter_openat 系统调用启用了 ftrace 事件跟踪。在 events/syscalls/sys_enter_openat/format 给出的相应输出格式是
print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx", ((unsigned long)(REC->dfd)), ((unsigned long)(REC->filename)), ((unsigned long)(REC->flags)), ((unsigned long)(REC->mode))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,ftrace 的示例输出行类似于
msm_irqbalance-1338 [000] ...1 211710.033931: sys_openat(dfd: ffffff9c, filename: 5af693f224, flags: 2, mode: 0)
Run Code Online (Sandbox Code Playgroud)
有没有办法改变输出格式,这样filename: 5af693f224可以显示为filename: <string>而不是hex(5af693f224)?
所以基本上有一种方法可以在跟踪特定事件(例如上面的 sys_enter_openat)到 ftrace 时更改输出格式。
我想这可以使用 systemtap 或 krpobe 实现,但我的设置目前不允许使用。
strace ×10
linux ×4
system-calls ×3
apache-httpd ×1
benchmark ×1
debugging ×1
files ×1
ftrace ×1
kernel ×1
ltrace ×1
monitoring ×1
password ×1
performance ×1
proc ×1
process ×1
recursive ×1
security ×1
shell-script ×1
sqlserver ×1
syscalls ×1
time ×1