代码之家  ›  专栏  ›  技术社区  ›  datenwolf

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

  •  0
  • datenwolf  · 技术社区  · 8 年前

    当使用特定参数调用某个系统调用时,是否有现成的工具来中止跟踪流程的执行?具体来说,我想在任何时候暂停程序执行

    stat("/${SOME_PATH}")
    

    readlink("/${SOME_PATH}")
    

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

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


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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Afshin    8 年前

    这是我在windows调试中用于类似条件的方法。尽管我认为这对你来说也是可能的,但我还没有试过 gdb 在linux中。

    1. 附加进程时,在系统调用上设置断点,例如 stat 在你的情况下。
    2. 根据添加条件 esp 到您的断点。例如,您要检查 stat("/$te") .价值 [esp+4] 应指向字符串的地址,在本例中为 "/$te" 。然后添加如下条件: *(uint32_t*)[esp+4] == "/$te" .看来你可以用 strcmp() 在你的情况下也是如此 here

    我认为类似的东西也应该适合你。