是否存在与-T
和-U
选项等效的内容truss
Solaris 实用程序在 Linux 上执行此操作。
它们用于指定系统调用 ( -T
) 或库函数 ( -U
),当被跟踪的应用程序调用它们时,将导致其停止。
或者,换句话说,我希望由跟踪的应用程序启动的任何进程在进行给定的系统调用或给定的共享库函数调用后立即停止(就像被 SIGSTOP 杀死一样)。
strace
在ltrace
Linux 上提供了 Solaris 的大部分功能集truss
,但他们似乎没有这样做。
例如:
truss -f -T open cmd
会像这样strace -f cmd
,只是如果正在执行的进程cmd
或其任何后代执行任何open
系统调用,它将立即停止(并且我可以稍后在方便时恢复它)
在某些情况下,我可以使用gdb
's ,但我一直在寻找一种解决方案,可以方便地跟踪分叉并继续对所有分叉进程执行此操作,甚至在scatch syscall
之后也继续执行此操作。execve
我似乎记得一些实用程序提供了相同的功能,甚至在某些远程系统调用之间的单步应用程序中提供了一个功能(或同一实用程序的选项),但我的记忆力不佳,我什至无法确定那是在Linux上。
答案1
据我所知,这不能通过内部使用的函数strace
或在调用时完成。ptrace
SIGSTOP
SIGINT
编辑:
我将这个简单的解决方案插入部委,因此不需要编码。
如果不需要 strace 的所有功能,我建议的解决方案是修改 ministrace - 我在这里找到的用 70 行代码给自己写一个 strace。
在一次性程序中,您可以在以下代码之前添加两行:
if (wait_for_syscall(child) != 0) break;
伪代码:
if(syscall == SYS_write)
do {
char str[4];
gets(str); // waits until enter to continue
} while(0);
我还没有测试过这些,最后的步骤留给你了。
答案2
Systemtap 应该能够做你正在寻找的事情,这是一个很好的指南: