是否在详细的MAP文件中的每个源行地址都是插入Int3h的有效地址?

时间:2009-06-17 03:54:09

标签: delphi winapi debugging

我正在尝试使用Delphi 2007创建代码覆盖率工具。

我的一般方法是使用Win32 Debug API为每个源代码行插入断点,然后在传递断点时删除断点 - 这样我就可以跟踪每个执行的源代码行。

我的方法概要:

  • 解析详细的MAP文件(由Delphi 2007生成)以查找每个源代码行的所有地址(仅适用于.text段)
  • 使用OpenProcess API调用
  • 以调试模式打开应用程序
  • 遍历每个源代码行并在每行的地址处插入Int3指令(使用WriteProcessMemory + FlushInstructionCache一个$ cc字节)
  • 继续执行并在触发每个断点时删除相应的断点并将该行标记为已覆盖
  • 在传递了每个断点或程序存在之后,我会生成一个报告,说明哪些行被覆盖以及哪些行不适用于每个源模块

现在回答我的问题:

详细MAP文件中的每个源行地址是否是插入Int3断点的有效地址?

虽然这种方法对于一些简单的单元来说是成功的,但是我试图访问违规地址包含$ cc的一些较大的应用程序的违规行为 - 这会让我认为我的方法需要一些修改才能工作。

关于更好方法的提示也非常受欢迎!

1 个答案:

答案 0 :(得分:1)

嗯,理论上:是的。实际上,我也是如此。如果Delphi可以在每一行都放置一个断点,那么你可以: - )。

对于某些情况,您可能需要一些特定的处理(例如:过程的第一行是本地变量的初始化,设置EBP等)。 所以你能找出它在哪种情况下失败了吗?

顺便说一下:好项目!它是开源的吗?

P.S。如果你需要一些汇编代码处理:请查看koldetours.pas(使用谷歌搜索)。