Sté*_*las 12 linux debugging signals system-calls truss
是否有与Solaris 实用程序的-T
和-U
选项truss
在 Linux 上执行的等效项。
这些是指定一个系统调用 ( -T
) 或库函数 ( -U
),当被跟踪应用程序调用时会导致它停止。
或者,换句话说,我希望被跟踪的应用程序启动的任何进程在执行给定的系统调用或给定的共享库函数调用后立即停止(就像被 SIGSTOP 杀死一样)。
strace
并且ltrace
在 Linux 上提供了 Solaris 的许多功能集truss
,但他们似乎没有这样做。
例如:
truss -f -T open cmd
Run Code Online (Sandbox Code Playgroud)
会是这样strace -f cmd
,只是如果在执行过程中cmd
或任何其后代做任何open
系统调用时,它会立即停止(我可以在我方便以后恢复它)
在某些情况下,我可以使用gdb
's catch syscall
,但我正在寻找一种可以方便地跟踪分叉并继续为所有分叉进程执行此操作的解决方案,即使在execve
s之后也继续执行此操作。
我似乎记得一些实用程序提供了相同的功能,甚至是一个(或同一实用程序的选项)在某些远程系统调用之间的单步应用程序,但我的记忆力让我失望,我什至无法确定那是在 Linux 上。
据我所知,这不能通过内部使用的函数strace
或在调用时完成。ptrace
SIGSTOP
SIGINT
我在ministrace中插入了这个简单的解决方案,因此不需要编码。
如果不需要 strace 的所有功能,我建议的解决方案是修改 ministrace - 我在这里找到了Write myself an strace in 70lines of code。
在一次性程序中,您可以在以下代码之前添加两行:
if (wait_for_syscall(child) != 0) break;
Run Code Online (Sandbox Code Playgroud)
if(syscall == SYS_write)
do {
char str[4];
gets(str); // waits until enter to continue
} while(0);
Run Code Online (Sandbox Code Playgroud)
我还没有测试过这些,最后的步骤留给你了。