如果调用具有特定参数的系统调用(GDB / strace),则暂停程序执行
Suspend program execution if syscall with specific parameters called (GDB / strace)
当使用特定参数调用特定系统调用时,是否有直接的方法使用现成的工具来暂停跟踪进程的执行?具体来说,我想在
时暂停程序执行
stat("/${SOME_PATH}")
或
readlink("/${SOME_PATH}")
被调用。然后我打算附加一个调试器,以便我可以识别链接到进程的数百个共享对象中的哪些正在尝试访问该特定路径。
strace
向我展示了正确的系统调用,gdb
完成了剩下的工作。问题是,如何将它们组合在一起。这肯定可以通过自定义胶水脚本来解决,但我宁愿使用干净的解决方案。
手头的问题是第 3 方工具套件,它仅以二进制形式提供,并且其分发包完全违反了 LSB/FHS 和良好的礼仪,并将共享对象放置在整个文件系统中,其中一些已加载来自不可配置的路径。我想确定工具套件的哪些模块尝试执行此操作,然后修补二进制文件或向供应商提出问题。
这是我在 windows 调试中用于类似情况的方法。尽管我认为你也应该可以,但我还没有在 linux.
中用 gdb
尝试过
- 当你附加你的进程时,在你的系统调用上设置断点,例如
stat
在你的情况下。
- 将基于
esp
的条件添加到您的断点。例如,您要检查 stat("/$te")
。 [esp+4]
处的值应指向字符串的地址,在本例中为 "/$te"
。然后添加一个条件,如:*(uint32_t*)[esp+4] == "/$te"
。看来您也可以按照 here. 所述在您的情况下使用 strcmp()
我认为类似的东西也应该适合你。
当使用特定参数调用特定系统调用时,是否有直接的方法使用现成的工具来暂停跟踪进程的执行?具体来说,我想在
时暂停程序执行stat("/${SOME_PATH}")
或
readlink("/${SOME_PATH}")
被调用。然后我打算附加一个调试器,以便我可以识别链接到进程的数百个共享对象中的哪些正在尝试访问该特定路径。
strace
向我展示了正确的系统调用,gdb
完成了剩下的工作。问题是,如何将它们组合在一起。这肯定可以通过自定义胶水脚本来解决,但我宁愿使用干净的解决方案。
手头的问题是第 3 方工具套件,它仅以二进制形式提供,并且其分发包完全违反了 LSB/FHS 和良好的礼仪,并将共享对象放置在整个文件系统中,其中一些已加载来自不可配置的路径。我想确定工具套件的哪些模块尝试执行此操作,然后修补二进制文件或向供应商提出问题。
这是我在 windows 调试中用于类似情况的方法。尽管我认为你也应该可以,但我还没有在 linux.
中用gdb
尝试过
- 当你附加你的进程时,在你的系统调用上设置断点,例如
stat
在你的情况下。 - 将基于
esp
的条件添加到您的断点。例如,您要检查stat("/$te")
。[esp+4]
处的值应指向字符串的地址,在本例中为"/$te"
。然后添加一个条件,如:*(uint32_t*)[esp+4] == "/$te"
。看来您也可以按照 here. 所述在您的情况下使用
strcmp()
我认为类似的东西也应该适合你。