在Linux上等效于“ truss -T”和“ truss -U”?


12

是否有与Solaris实用程序的-Tand -U选项truss在Linux上等效的功能。

这些用于指定系统调用(-T)或库函数(-U),当被跟踪的应用程序调用该函数时,该函数将导致其停止。

或者,换句话说,我希望由跟踪的应用程序启动的任何进程在进行给定的系统调用或给定的共享库函数调用时立即停止(好像被SIGSTOP杀死)。

strace并且ltrace在Linux上提供了Solaris的许多功能集truss,但他们似乎并没有这么做。

例如:

truss -f -T open cmd

会是这样strace -f cmd,只是如果在执行过程中cmd或任何其后代做任何open系统调用时,它会立即停止(我可以在我方便以后恢复它)

在某些情况下,我可以使用gdbcatch syscall,但我一直在寻找一种解决方案,可以方便地遵循forks并继续对所有分叉的过程进行处理,即使在execves 之后也继续进行处理。

我似乎想起了一些提供相同功能的实用程序,甚至是在远程发生某些系统调用之间,甚至一步一步地向单步应用程序(或同一实用程序的选项),但我的记忆力却使我失望了,我什至无法确定在Linux上。


1
这不是您问题的真正答案,但gdb确实有一些用于后续fork的选项,它只是不能取消execve。但是,它一次仍然只执行一个进程,如果您正在寻找类似strace的功能,那么这可能会破坏交易,但是我想我只是为了以防万一。
布莱奇利2013年

@JoelDavis,谢谢。似乎在执行exec(follow-exec-mode)之后也可以跟进,我正在对此进行试验。不能严格回答问题,但可能足以满足我的需求。
斯特凡Chazelas

如果我理解您的问题,那么您正在寻找一种跟踪方法,直到看到特定信号然后停止跟踪,而不是以任何方式停止或终止正在跟踪的应用程序,对吗?
slm

@slm,不,我希望由跟踪的应用程序启动的进程在进行给定的系统调用后立即停止(好像被SIGSTOP杀死)。我已经添加了指向Solaris手册truss页的链接。
斯特凡Chazelas

让我确保我理解正确。您需要一种在执行特定系统调用时停止进程的方法。那是对的吗?
sparticvs

Answers:


3

据我所知,这不能做的strace,在ptrace其内部使用确实功能SIGSTOPSIGINT来电。

编辑:

我在ministrace中插入了这个简单的解决方案,因此不需要编码。

如果不要求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);

我还没有解决任何这些问题,这些最后的步骤留给您。


谢谢。它有效,该链接非常有用。但是(在几行代码中可以理解),它不能像gdb / strace一样进行arg解码,因此对于我的目的不会有用。它表明它很容易完成。我最终选择了gdb,但为该功能修补strace似乎相对容易。让问题悬而未决,因为我怀疑已有命令可以这样做。有空的时候我会看看python-ptrace。
斯特凡Chazelas

别客气!我在扩展实现方面有些疯狂,因此可以通过id和name引用syscall。再次与ptrace一起玩很有趣。
丹尼尔W.康普顿

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.