我们可以记录给cpu的指令吗?

时间:2015-05-14 10:08:56

标签: c++ memory cpu

鉴于内存中用户驱动程序的初始状态,我们是否可以记录给cpu的指令,将程序重新加载到其初始状态并回放cpu指令并让程序像用户使用时一样运行它没有用户吗?

如果这个问题写得不好或令人困惑,我很抱歉。

4 个答案:

答案 0 :(得分:2)

如果用户确实与该计划进行了互动而您没有存储输入历史(或其他形式的互动),那么答案显然是否定的。

完整的执行跟踪可能很大(每秒1千兆指令......)

答案 1 :(得分:1)

最有可能!可以通过指令在调试器中逐步执行程序。您还必须以某种形式记录指令,尽管程序源或可执行文件也可以正常工作。

某些程序喜欢存储网络日志或操作日志等内容,以便在某个时间点存储程序的状态。数据库还可以存储重要信息,当程序“失败”时也可以查看这些信息。像日志这样简单的东西可用于记录程序的输入。

对于单步执行指令,您应该能够使用GDB中的nextistepi命令来执行指令操作。我们还可以使用disassemble来获取与各个CPU指令相匹配的汇编指令。在LLDB和MSVC的调试器中也应该有类似物。

现在,我的例子是“内存中用户驱动程序的状态:”

enter image description here

这是Windows蓝屏死机,但我们可以看到Windows实际上创建了一个物理内存转储,并且还为内核使用了调试器。

可以假设物理内存转储可用于解决当时系统的问题以及导致操作系统崩溃的原因。

至于记录单个指令,程序可执行文件本身应足以记录确切发生的情况,因为程序的执行路径由其使用的功能和操作明确定义。除非您在运行时编写执行代码时使用某种运行时元编程,否则应该能够对事物进行分析。而且,即使您在运行时编写执行代码,它仍然可以从良好的内存转储中提取,可能来自沙盒环境内部或通过元程序提取失败程序的状态。

相关:http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html#STEPI

答案 2 :(得分:0)

这是一个关于您正在运行的系统的问题。通常可以跟踪调试目的,某些CPU有一个特殊的跟踪指令。您可以记录程序的每个步骤,包括所有数据访问。我们的想法是稍后找出执行哪个程序流程以及在程序的哪个部分访问了哪些数据。

我不知道有任何工具可以回读这样的跟踪并且表现得像原始程序一样。

运行带有模拟用户输入的程序是另一部分,但与您的想法无关。这里程序的输入将针对某些创建或记录的数据源运行。在大多数系统上都可以正常工作。特别是在基于X-Windows的GUI系统上,很容易模拟事件并将它们播放到X Windows消息管道中。

另一种解决方案是使用一种虚拟用户。您可以编程或记录用户交互并每次运行程序。这些解决方案可以在windows和linux系统中找到。维基百科提供了一长串工具:http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

另请查看sikuli http://www.sikuli.org/

答案 3 :(得分:0)

你的问题的答案是否定的。假设您的系统目前只有一个进程,系统仍将响应中断。这种中断可以随时发生。如果没有在相同的相对时间发生完全相同的外部事件,重复处理中断将毫无意义。