首页 文章

strace:如何确定系统调用是否已调用另一个系统调用?

提问于
浏览
1

“strace是一个系统调用跟踪器,即一个调试工具,它打印出另一个进程/程序所做的所有系统调用的跟踪 . ”如果系统调用以递归方式工作或一个系统调用调用另一个系统调用,该怎么办?我怎样才能获得这些信息?

可能的解决方案 - 我们可以创建一个简单的变量缩进,我们在进入系统调用时递增,在退出时递减 . 现在只需在每次调用之前打印“缩进”空格数 . 所以我们可以得到这样的东西 -

05:31:09.449402 getpriority(PRIO_PROCESS, 0) = 20
05:31:09.450514 ioctl(7, 0xc0186201, 0xbef86ac0) = 0
05:31:09.451817  ioctl(7, 0xc0186201, 0xbef86c10) = 0
05:31:09.524328 writev(4, [{"\4", 1}, {"ServiceManager\0", 15}, {"ServiceManager: addService(SMS, 0x15988)\n\0", 42}], 3) = 58
05:31:09.526862  futex(0x134ac, FUTEX_WAKE, 2147483647) = 0
05:31:09.527847   getpriority(PRIO_PROCESS, 0) = 20
05:31:09.528758 ioctl(7, 0xc0186201, 0xbef86ac0) = 0
05:31:09.529847 ioctl(7, 0xc0186201, 0xbef86c10) = 0

strace或其他工具是否已提供此功能,还是需要更改源代码才能实现此功能?

2 回答

  • 0

    系统调用被定义为内核和用户空间之间的边界,因此任何递归都发生在内核中并且不能被截获 .

    strace 通过作为调试器附加到进程来工作,让它自由运行,除非触发系统调用,此时打印参数和返回值 . 它不知道内核中发生了什么 .

  • 6

    如果您具有root访问权限,则可以使用ftrace跟踪内核函数调用,并按内核端系统调用接口的名称进行筛选 . 使用function_graph作为跟踪器(有关说明,请参阅https://lwn.net/Articles/366796/) . 由于"original syscall"也通过了这样的调用,你可以在post-syscall调用中清楚地看到一个post-syscall调用 . 公平警告:我不确定这种情况有多频繁 .

相关问题