我正在尝试使用 Delphi 2007 创建一个代码覆盖率工具。
我的一般方法是使用 Win32 调试 API 为每个源代码行插入断点,然后在传递断点时删除它们 - 这样我就能够跟踪每个执行的源代码行。
我的方法概述:
- 解析详细的 MAP 文件(由 Delphi 2007 生成)以查找每个源代码行的所有地址(仅适用于 .text 段)
- 使用 OpenProcess API 调用以 Debug模式打开应用程序
- 迭代每个源代码行并插入 Int3每行地址处的指令(使用 WriteProcessMemory + FlushInstructionCache 的一个 $cc 字节)
- 继续执行,当每个断点被触发时,删除相应的断点并将该行标记为被覆盖
- 在通过每个断点或程序存在后,我会生成一份报告,说明每个源模块覆盖了哪些行以及未覆盖哪些行
现在回答我的问题:
详细 MAP 文件中的每个源代码行地址都是插入 Int3 断点的有效地址吗?
虽然该方法对于一些简单的单元来说是成功的,但我遇到了一些较大应用程序的访问违规问题,其中违规地址包含 $cc - 这会让我认为我的方法需要进行一些修改才能工作。
也非常欢迎有关更好方法的提示!
最佳答案
嗯,理论上:是的。而且实用,我也认为是的。如果 Delphi 可以在每一行上放置断点,那么您也可以:-)。
对于某些情况,您可能需要一些特定的处理(例如:过程的第一行是本地变量的初始化、设置 EBP 等)。 那么你能找出什么情况下会失败吗?
顺便说一句:不错的项目!它是开源的吗?
附注如果您需要一些汇编代码处理:请查看 koldetours.pas(使用 google 搜索)。
关于delphi - 详细 MAP 文件中的每个源行地址都是插入 Int3h 的有效地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005042/