2017-05-29 89 views
-4

我想知道是否有记录只是汇编代码指令的一种方式,是执行。这可以通过使用GDB来实现吗?日志汇编代码执行

+2

代码中的所有内容都是*只是程序集* – Ari0nhh

+0

反汇编二进制代码会更容易......这将为您提供所有已执行的指令。如果您需要关注分支等,请添加*特定的*日志代码。 –

+0

[Process Record](https://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial)可能是您要查找的内容中最接近的。 – ks1322

回答

1

理论上,将CPU置于单步模式非常简单,并且在执行时记录每条指令。实际上,你不能合理地计划这样做的时间超过几秒钟(或者一般订单上的某些事情)。让我们通过一些数学来理解为什么。

现在,我们假设一个地址占用32位。我们假设典型的指令平均使用大约2个字节的数据。一个典型的CPU可能运行在2.5 GHz,并且每个周期执行大约2条指令。因此,记录单个指令需要大约6个字节的数据。 CPU每秒执行大约50亿次。做数学计算,这意味着记录一秒钟的执行将需要大约6 * 50亿字节=每秒30千兆字节(每个核心)。

如果我们把它写入RAM,我们可能预期执行速度会比正常慢一点,所以执行和记录一秒钟将需要几分钟。然而,当我们用完RAM时(以30GB/s,我们会很快),并且必须将数据写入磁盘,我们的带宽(即使是相当快的SSD)也会下降很多,所以执行速度将很快甩掉很多。同样,目前,我(或多或少)假设我们可以完全使用(例如)至少一个内核来收集和记录由另一个内核生成的数据。如果我们想从四核(比如说)中记录数据,那么数据收集可能会减慢一些数据的收集速度,并且(更糟糕的)数据生成的速度也会增加4倍(所以我们有一个核心来收集120 GB/s)。这显然会变得更加困难。

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

所有这一切说,我不认为gdb真的是这份工作的正确工具。如果你真的坚持这样做(可能是一个糟糕的主意,但是......),你几乎肯定希望代码专门用于处理这个特定的工作。