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

标签 delphi winapi debugging

我正在尝试使用 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/

相关文章:

delphi - Firemonkey 的 SynEdit?

delphi - 替换 TObjectList 中的对象并释放它(Delphi7)

c# - 如何使用 WPF(或互操作)在不给予焦点的情况下恢复窗口

c++ - 我们如何防止控制台窗口在 Visual Studio 下显示?

python - 在堆栈跟踪中打印函数的参数值

C++ Hello World 不工作?

delphi - 如何在 TMenuOption 中显示希腊符号

delphi - 替换Delphi XE3中的RIDL文件和typelib

c# - 从安全的角度来看,在 Windows 中使用管道是否被认为是危险的?

c++ - 在 MFC CLR 项目上调试断言错误