Debugging 如果调用了带有特定参数的syscall(GDB/strace),则暂停程序执行

Debugging 如果调用了带有特定参数的syscall(GDB/strace),则暂停程序执行,debugging,gdb,reverse-engineering,system-calls,strace,Debugging,Gdb,Reverse Engineering,System Calls,Strace,当使用特定参数调用某个系统调用时,是否有一种使用现成工具的straigtforward方法来暂停跟踪流程的执行?具体地说,我想随时暂停程序执行 stat("/${SOME_PATH}") 或 我们称之为。我的目标是连接一个调试器,以便识别链接到进程中的数百个共享对象中的哪一个正在尝试访问该特定路径 strace向我展示了系统调用,其余的由gdb完成。问题是,如何将它们结合在一起。这当然可以通过自定义胶水脚本来解决,但我宁愿使用干净的解决方案 目前的问题是第三方工具套件,它仅以二进制形式提供,并

当使用特定参数调用某个系统调用时,是否有一种使用现成工具的straigtforward方法来暂停跟踪流程的执行?具体地说,我想随时暂停程序执行

stat("/${SOME_PATH}")

我们称之为。我的目标是连接一个调试器,以便识别链接到进程中的数百个共享对象中的哪一个正在尝试访问该特定路径

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


目前的问题是第三方工具套件,它仅以二进制形式提供,并且该分发包完全违反了LSB/FHS和良好的方式,并将共享对象放置在整个文件系统中,其中一些是从不可配置的路径加载的。我想确定toolsuite的哪些模块尝试这样做,或者修补二进制文件,或者向供应商提交问题。

这是我在windows调试中用于类似情况的方法。尽管我认为这对您来说也是可能的,但我还没有在linux中使用gdb进行过尝试

在附加进程时,在系统调用上设置断点,例如在您的情况下设置stat。 将基于esp的条件添加到断点。例如,您想要检查stat/$te。[esp+4]处的值应指向字符串的地址,在本例中为/$te。然后添加如下条件:*uint32\u t*[esp+4]==/$te。看来你也可以在你的情况下使用strcmp。
我认为类似的东西也应该适用于您。

特定于操作系统的东西可以吗?使用systemtap和dtrace,当进程使用某些参数进行系统调用时,向进程发送SIGSTOP很容易,但它们并不存在于任何地方,并且需要提升权限。目标操作系统是Linux,因此dtrace是可用的@Afshin的答案也很合适,不过我也希望看到dtrace解决方案。
readlink("/${SOME_PATH}")