2015-05-14 53 views
4

给出内存中用户驱动程序的初始状态,我们可以记录提供给CPU的指令,将程序重新加载到初始状态并播放CPU指令,并使程序像用户使用它时一样运行,没有用户在那里?我们可以记录给CPU的指令吗?

对不起,如果这个问题写得不好,或混淆。

+1

你的问题背后的目标是什么?调试?测试?模拟?一切皆有可能,但所有解决方案都不相同如果您提供更多信息,我们可以提供更好的帮助:-) – Klaus

回答

1

最有可能!可以在调试器中逐步执行程序,按指令执行指令。您还必须以某种形式记录说明,但程序源代码或可执行文件也可能工作得很好。

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

为了逐步执行指令,您应该能够在GDB中使用nextistepi命令以便按指令执行指令。我们也可以使用disassemble来获得应该与各个CPU指令相匹配的汇编指令。在LLDB和MSVC的调试器中也应该有类似的东西。

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

enter image description here

它的死亡的Windows蓝屏,但我们可以看到,Windows实际上创建了一个物理内存转储,并使用内核的调试器。

可以假定物理内存转储可以用来发现系统当时的问题以及导致操作系统崩溃的原因。

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

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

2

如果用户没有在与程序交互,你没有存储输入(或相互作用的其他形式)的历史,答案显然是否定的。

一个完整的执行跟踪可以是巨大的(每秒千兆1个指示...)

0

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

我不知道有任何工具可以读回这样的痕迹,并像原始程序那样工作。

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

另一种解决方案是使用一种虚拟用户。您可以编程或记录用户交互并每次运行程序。这些解决方案可以在Windows和Linux系统上找到。维基百科给出的工具,一个长长的清单:http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

而且看一看的sikuli http://www.sikuli.org/

0

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

相关问题