繁体   English   中英

如果系统调用了带有(GDB / strace)的特定参数的syscall,则挂起程序执行

[英]Suspend program execution if syscall with specific parameters called (GDB / strace)

当使用特定参数调用某些syscall时,是否有准备就绪的方法可以中止挂起已跟踪进程的执行? 具体来说,我想随时暂停程序执行

stat("/${SOME_PATH}")

要么

readlink("/${SOME_PATH}")

叫做。 然后,我打算附加一个调试器,以便可以识别链接到该过程的数百个共享库中的哪个正在尝试访问该特定路径。

strace向我展示了syscalls,其余的由gdb完成。 问题是,如何将它们融合在一起。 这当然可以通过自定义胶水脚本解决,但我宁愿使用干净的解决方案。


当前的问题是第三方软件套件,它仅以二进制形式提供,并且该分发包完全违反了LSB / FHS和良好的方式,并在文件系统上放置了共享对象,其中一些是从无法配置的路径加载的。 我想确定工具套件的哪个模块尝试执行此操作,并修补二进制文件或向供应商提出问题。

这是我在Windows调试中用于类似条件的方法。 即使我认为您也应该有这种可能,但我还没有在Linux中用gdb尝试过。

  1. 当您附加进程时,请在系统调用上设置断点,例如您的情况下的stat
  2. 将基于esp的条件添加到断点。 例如,您要检查stat("/$te") [esp+4]处的值应指向字符串的地址,在这种情况下为"/$te" 然后添加一个条件,例如: *(uint32_t*)[esp+4] == "/$te" 似乎您也可以按此处所述条件中使用strcmp()

我认为类似的方法也应该适用于您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM