【问题标题】:How to set a watchpoint at a file in GDB to break whenever the file is modified? [duplicate]如何在 GDB 中的文件上设置观察点以在文件被修改时中断? [复制]
【发布时间】:2016-03-24 07:08:21
【问题描述】:

在调试我的程序时,我想观察程序对文件所做的更改,并且我希望调试器在发生这种情况时告诉我

我正在调试一个创建或修改某些文件(比如说文本文件)的程序。可以从程序中的多个位置修改文件,并且可以多次修改文件。修改顺序很重要。我正在寻找一种在文件上设置观察点的方法,就像我们在变量上设置一样。基本上我希望程序在文件被修改时中断,以便我可以分析文件内容并进一步观察程序。有没有办法做到这一点?

【问题讨论】:

  • 在 fprintf / write 或用于写入文件的任何函数上放置断点。或者为这些函数实现一个包装器并添加日志记录。
  • 但这完全会破坏 frprintf。它不会是特定于文件的。我希望它只针对我想要观察的特定文件中断
  • 您是否需要检测文件何时被实际修改(使用writeftruncateWriteFile 等),或者何时缓存可能写入的数据的库例程稍后调用文件(fprintffputsfwrite)?如果是后者,并且如果您正在使用 stdio 函数,那么在 FILE 结构的某些元素上放置一个观察点,虽然不可移植,但可能是最简单的方法。您使用的是什么操作系统?

标签: c gdb


【解决方案1】:

我认为你不会轻易做到这一点。这是一个新奇的概念,至少我从未听说过。

文件通常不是调试器理解和管理的“范围”内的东西,因此无法告诉调试器执行此操作。此外,单步/调试模型也不完全是如何在幕后工作的,因为文件是一个相当高级的概念,而中断依赖于在到达特定地址后停止执行。

您需要在对相关文件执行 I/O 的所有函数中放置条件断点,并以某种方式提出一个条件来仅过滤掉您感兴趣的文件。

【讨论】:

    【解决方案2】:

    我能想到的两种方法:

    • 为您的读/写函数设置一个条件断点,该断点将在您指定的文件描述符/文件指针处中断。

    • 为记录文件描述符活动的读/写系统调用编写包装器,并使用 LD_PRELOAD 将其作为共享库加载。

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 2011-11-15
      • 2018-07-03
      • 2023-03-12
      • 2012-03-29
      • 1970-01-01
      • 2011-01-12
      • 2010-12-01
      相关资源
      最近更新 更多