【问题标题】:Logging assembly code execution记录汇编代码执行
【发布时间】:2017-05-29 03:07:28
【问题描述】:

我想知道是否有一种方法可以记录执行汇编代码指令。这可以使用 GDB 实现吗?

【问题讨论】:

  • 代码中的一切都是只是程序集
  • 只反汇编二进制文件会更容易......这将为您提供所有已执行的指令。如果您需要关注分支等,请添加 特定 日志记录代码。
  • Process Record 可能是最接近您正在寻找的。​​span>

标签: c++ assembly gdb


【解决方案1】:

理论上,将 CPU 置于单步模式非常容易,并在执行每条指令时对其进行记录。实际上,您不能合理地计划执行此操作超过几秒钟(或按一般顺序执行)。让我们通过一些数学来了解原因。

目前,我们假设单个地址占用 32 位。假设一条典型指令平均使用大约 2 个字节的数据。一个典型的 CPU 可能以 2.5 GHz 的频率运行,每个周期执行大约 2 条指令。因此,记录一条指令需要大约 6 个字节的数据。 CPU 每秒执行大约 50 亿次。算一下,这意味着记录一秒的执行将需要大约 6 * 50 亿字节 = 30 GB/秒(每个内核)。

如果我们将其写入 RAM,我们可能会预期执行会比正常慢一个数量级,因此执行和记录一秒钟将需要 一些 像几分钟。但是,当我们用完 RAM 时(以 30 GB/s 的速度,我们将很快)并且不得不将数据写入磁盘,我们的带宽(即使使用相当快的 SSD)会下降很多,因此执行速度很快就会再掉很多。同样,目前,我(或多或少)假设我们可以(例如)完全使用(例如)至少一个核心来收集和记录由另一个核心生成的数据。如果我们想从(比如说)四个核心记录数据,数据收集可能会减慢一些速度,并且(更糟糕的是)生成数据的速率也会上升 4 倍(所以我们有一个核心要收集120 GB/秒)。这显然要困难得多。

从那里我们遇到了另一个明显的问题:我们要如何处理这个数据?鉴于我们产生的数量,显然最好在执行期间进行尽可能多的处理以找到我们真正关心的数据,而不是仅仅收集所有数据,不管它最终可能会变得多么无用。

话虽如此,我认为 gdb 并不是真正适合这项工作的工具。如果您真的坚持这样做(可能是一个糟糕的想法,但是...),您几乎肯定需要专门用于处理这项特定工作的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多