Articles of strace

计数程序的系统调用,并用strace检查结果的有效性

我正在使用ptrace来计算程序的系统调用。 问题是给定一个程序A,我的程序打印出系统调用的数量(打开,closures,读取,写入)。 我的程序和strace(带-c选项)的结果与程序A的参数是一样的,除了开放的系统调用。 我的程序打印15和strace打印3。 但是我猜测,strace也打印了一些其他的系统调用,这些可能总结为我的程序计算的15个开放系统调用。 我在查看ORIG_EAX / RAX寄存器时使用SYS_open来检查ptrace的结果。 strace打印的系统调用在这里。 更新: 我从terminal编译我的程序并从那里运行,结果与strace相同。 我正在开发netbeans。 为什么会发生?

除strace之外还有其他的方法来loggingiotcl的调用吗?

我试图看看某些ioctl调用在我调用一个函数的时候被调用(这是在linux上)。没有办法让内核用这类数据写一个日志,是吗?

在Linux中strace init进程(PID 1)

strace manpage说: 在Linux上,尽pipe如此,追踪init进程是被禁止的。 我查了同样的,它不允许: $ strace -p 1 attach: ptrace(PTRACE_ATTACH, …): Operation not permitted 为什么不可能? 即使是ptrace的manpage也跟跟踪init进程一样。 这些工具不是安全的,或者只是init进程被认为是太特殊的,没有其他进程(strace / ptrace)可以发信号。

如何监视哪些文件消耗iops?

我需要了解哪些文件消耗我的硬盘的iops。 只是使用“strace”不会解决我的问题。 我想知道,哪些文件是真正写入光盘,而不是页面caching。 我试图使用“systemtap”,但我不明白如何找出哪些文件(文件名或inode)消耗我的iops。 有什么工具可以解决我的问题吗?

Bash脚本退出没有错误

我有一个bash脚本,我从DVD上运行。 此脚本将DVD中的多卷tar文件复制到本地计算机。 在复制的部分path中,脚本提示用户插入第二张DVD,此时复制剩余的文件。 该脚本存在于第一张DVD上,但不在第二张。 该脚本只是在复制最后一个文件之后停止,而不是在启动tar多卷提取操作和后续处理之前停止。 没有报告的错误或消息。 我试着用'-x'运行bash,但是没有什么可疑的 – 甚至没有退出语句。 更不幸的是,这种行为是不一致的。 有时脚本会停止,但有些时候会继续没有问题。 我在脚本上运行strace。 在复制操作结束之后,我看到这样的结果: read(255, "\0\0\0\0\0\0\0\0\0\0"…, 5007) = 1302 read(255, "", 5007) = 0 exit_group(0) = ? 我知道bash将脚本文件读入内存并从那里执行它,但它有可能在某个时刻重新读取脚本文件并失败(因为它不再存在)? tar文件非常大,从脚本开始到复制最后一个文件(从第二张DVD)开始,大约需要10-15分钟。

strace输出问题

我在CentOS和Debian上运行一个程序。 输出是完全一样的,但在Centos中,我得到了3行粗体,而在Debian中我没有。 那三行是关于什么的?我怎样才能让他们进入Debian呢? execve(“./ z1”,[“./z1”],[/ * 31 vars * /])= 0 brk(0)= 0x8458000 访问(“/ etc / ld.so.nohwcap”,F_OK)= -1 ENOENT(没有这样的文件或目录) mmap2(NULL,8192,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0xb7f41000 访问(“/ etc / ld.so.preload”,R_OK)= -1 ENOENT(没有这样的文件或目录) 打开(“/ home / myuser / public_html / libs / libmudflap.so.0”,O_RDONLY)= 3 (3,“\ 177ELF \ 1 \ 1 \ 1 \ 0 \ 0 \ […]

原始克隆系统调用不能正常工作

我正在尝试使用原始克隆系统调用来避免将pid 0代码重构为一个函数。 Linux需要16个字节的堆栈,另外,libc保留16位,据推测可以存储ptid和ctid。 下面的代码创build一个alignment的堆栈然后退出小孩。 等待由libc的包装器克隆的孩子后,我使用原始系统调用与相同的缓冲区,但每次程序segfaults时使用原始系统调用。 附加是从strace的输出,除非我忽略任何东西显示系统调用参数是两次相同。 至less还有一个其他问题的原始克隆系统调用 SO,其中OP似乎有类似的困难,不幸的是,接受的答案使用libc克隆包装而不是系统调用。 #define _GNU_SOURCE #include <sched.h> #include <stdalign.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <syscall.h> #include <signal.h> #include <stdint.h> #include <errno.h> #include <string.h> #include <sys/wait.h> int test(void*c) { quick_exit(0); } int main(void) { alignas (16) unsigned char stack[4096] = {0}; printf("Top of stack %p\n", stack+sizeof(stack)); printf("Top of stack […]

可视化strace输出

有没有一个简单的工具,或者可能是一个方法将strace输出转换成可视化的或更容易筛选的东西? 我不得不弄清楚应用程序出错的地方,但是它会产生大量的数据。 试图追踪这个应用程序和它的线程在更大规模上正在做什么(或者试图做什么)被certificate是很难读取每个系统调用的。 我没有任何预算,我们是一个纯粹的Linux商店。

如何获得相对path的cwd?

如何获得当前工作目录在strace输出,用相对path调用的系统调用? 我试图debugging复杂的应用程序,产生多个进程,并无法打开特定的文件。 stat("some_file", 0x7fff6b313df0) = -1 ENOENT (No such file or directory) 由于some_file存在,我认为它位于错误的目录中。 我试图跟踪chdir调用,但是由于输出是交错的,所以很难推导出工作目录。 有没有更好的办法?

发送Ctrl + C以导致目标进程的写入系统调用失败,并显示“中断的系统调用”

我正在用time strace -p 54545 -fy 2>&1 | grep "xyz"做strace time strace -p 54545 -fy 2>&1 | grep "xyz" 。 我正在寻找所有的文件xyz发生的系统调用。 我通过不断地按Ctrl – C来杀死strace。 在进程54545中,我看到一个write系统调用失败,errno 4。 我没有发送任何信号来处理54545.可以strace导致这个?