标签: strace

无法杀死的 apache2 进程

从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 …

process segmentation-fault strace apache-httpd

6
推荐指数
1
解决办法
591
查看次数

为什么`time` 和`strace -c` 不同?

据我了解,time将记录在系统调用中花费的总时间。然后,我会期望SYS时间累计总量所报告的timestrace -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)

linux time strace syscalls

6
推荐指数
1
解决办法
762
查看次数

从 strace 日志中过滤掉失败的系统调用

我可以运行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)

system-calls strace

6
推荐指数
1
解决办法
5673
查看次数

系统调用号?运行时的名称映射

有没有办法解决观察到的系统调用的数量:

SYS_345(0xe, 0xbff94188, 0x2, 0x4000, 0xb6526000) = 2
Run Code Online (Sandbox Code Playgroud)

在正在运行的内核中使用它的符号名称而不在源代码中查找它?

编辑用例是一个过时的strace二进制文件,位于外部框上,其内核源代码检索起来可能很乏味。

linux system-calls strace

6
推荐指数
1
解决办法
3158
查看次数

Stracing su 和 ssh 显示密码。这是安全漏洞还是我遗漏了什么?

我目前对此很着迷,strace因为是新手,所以我决定稍微玩一下。正如问题标题所建议的那样,我尝试了strace sustrace ssh。这两个命令都显示了我在 strace 输出中输入的密码。su一直抱怨密码不正确,同时ssh设法正常登录。
我的问题:

  • 这是安全漏洞还是我遗漏了什么?
  • 是否su将错误的密码报告为一种安全措施,因为它检测到它正在运行strace?如果是这样,它怎么知道它是通过 调用的strace?它会检查/proc/self/cmdline吗?
  • 像这样的事情会造成多大的损害
    alias su="strace -o /tmp/output.log su"

security password strace

5
推荐指数
1
解决办法
4424
查看次数

strace 如何监控自身?

我有一个假设的情况:

  1. 假设我们有两个 strace 进程 S1 和 S2,它们只是相互监视。
    这怎么可能?
    好吧,在 strace 的命令行选项中,-p PID是传递所需 PID 的方式,当我们发出 strace 命令时,它(在我们的例子中)还不知道。我们可以更改 strace 源代码,这-P 0意味着向用户询问 PID。例如,来自 STDIN 的 read()。当我们可以在两个 shell 会话中运行两个 strace 进程并在第三个 shell 中找到 PID 时,我们可以将该输入提供给 S1 和 S2 并让它们相互监视。
    S1 和 S2 会卡住吗?或者,进入无限循环,或立即崩溃或...?

  2. 再一次,假设我们有另一个 strace 进程 S3,使用-p -1,通过修改源代码,我们用它来告诉 S3 监视自己。例如,使用 getpid() 而不使用 STDIN。 S3会崩溃吗?或者,它会挂起而无法进一步处理吗?它会等待某个事件发生,但是,因为它在等待,所以不会发生任何事件吗?

在 strace 手册页中,它说我们无法监视 init 进程。是否有任何其他限制由 strace 或内核强制执行,以避免循环依赖或循环?

一些特殊情况:
S4 监控 S5,S5 监控 S6,S6 监控 S4。
S7 和 S8 相互监视,其中 S7 是 S8 的父级。 …

kernel monitoring recursive strace

5
推荐指数
2
解决办法
1391
查看次数

无法使用 strace 捕获文件创建

当我make在构建目录中运行以下命令时,它几乎是空的(有问题的文件绝对不存在)

strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>

完成后,文件就完全存在了。因此,它必须make是由其子进程(或它们的子进程的子进程等)或其中一个子进程创建的。

但是,当我strace为文件名或 forcreat我查找日志时,找不到负责创建此文件的系统调用。

我错过了什么?我应该监视其他系统调用吗?


编辑:

事实证明,错误出在我的 strace 命令和我的 grepping 中。所有的答案都很有帮助,谢谢大家的时间。

我实际上没有传达该文件在子目录中的信息,并且我正在使用文件名和子目录的名称进行搜索。但是由于 strace 不提供有关当前工作目录的信息,因此这种方法效果不佳(我最终通过 stracechdirrename调用来获得所需的效果)。

因此,PaulHaldane 的第一个建议是正确且切中要害的。以及 larsks 的回答,其中他实际上已经猜到了文件是如何创建的。

linux files strace

5
推荐指数
1
解决办法
2708
查看次数

如何从进程中隐藏 TracerPID?

我猜想Linux 上的 SQL Server 正在检查/proc/self/statusTracerPID如果不是,则停止运行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)

sqlserver proc strace ltrace reverse-engineering

5
推荐指数
1
解决办法
3021
查看次数

进程创建时间、shell脚本和系统调用开销

我有一台使用 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

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

将 syscall 事件跟踪输出的格式更改为 ftrace

我为 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 实现,但我的设置目前不允许使用。

linux debugging system-calls strace ftrace

5
推荐指数
1
解决办法
593
查看次数