如何加快/减慢应用程序的“时间”

时间:2010-03-30 03:34:12

标签: macos time

我想我在标题中并没有说得对。 我打算做的是挂钩一些系统api,比如每次都会发生时间中断(这是操作系统中每个应用程序解释时间的方式),并使应用程序调用此api返回更大/更小的结果。因此,从应用程序的角度来看,时间已经加快或减慢。 我在Windows上找到了一些应用程序,有人能给我一些关于如何在Mac OS X上实现它的指针吗?

4 个答案:

答案 0 :(得分:3)

您的问题必须分为两部分:

  1. 许多应用程序使用的时间值源是什么?
  2. 如何截取此来源?
  3. 1)的答案(大致按重要性顺序排列):

    • 系统时钟,由gettimeofday读取(反过来,由NSDate,CFAbsoluteTime使用......)
    • 一张声卡的时钟。许多多媒体应用程序将视觉效果与音频同步,并将音频用作时间的驱动源。
    • 视频时钟(计算vsyncs)
    • 处理器滴答计数器,中断等
    • 只是程序计数器的进步(执行速度)。

    修改

    • 马赫定时功能。谢谢,@ tc,指出了这一点。

    拦截gettimeofday相对容易:只需构建一个动态库,其中包含与原始gettimeofday具有相同名称和签名的函数(请参阅#include <sys/time.h>)。此函数应返回您想要的任何值。

    要在应用程序中使用此特殊gettimeofday函数,请在终端上启动它,如下所示:

    DYLD_INSERT_LIBRARIES=/path/to/myGetTimeOfDay.dylib /Applications/TextEdit.app/Contents/MacOS/TextEdit
    

    当然,你的dylib必须与应用程序架构相匹配。

答案 1 :(得分:2)

我不是OS X开发人员,所以我不能给你具体细节。但我知道Windows,并且可以猜测如何实现这一点 - 您可能能够转换一些技术。

为了说明,我们假设大多数想要遵循Windows上抽象时间段的程序使用GetTickCount。这将返回自系统启动以来的毫秒数。 (应用程序可以使用其他API,但技术保持不变。)

要更改应用程序显示的时间,需要更改此时间函数返回的值。 (例如乘以一个因子)所以我们创建一个包装函数来应用转换:

  DWORD GetTimeWarpTickCount()
  {
      static double factor = 2.0;
      return (DWORD)(GetTickCount()*factor);
      // simple implementation - you can be more sophisticated than this 
      // to preserve accuracy if necessary
  }

编写完功能后,使用hooking将原始Win32功能替换为您自己的功能。可以基于每个应用程序进行挂钩,因此您可以将时间更改本地化到特定应用程序。

因此,简而言之,如果有一种方法可以覆盖OS X为应用程序提供的基本时间函数,那么您可以应用相同的过程。

答案 2 :(得分:2)

除了修补gettimeofday()(或者它在引擎盖下调用的任何内容)之外,你还需要修补mach_timebase_info():它返回mach_absolute_time()的频率,几乎在系统API的每个地方都使用它。时间戳是“自启动以来的时间”。当然,您也可以修补mach_absolute_time(),但这可能会带来更高的开销。有关详细信息,请参阅QA1398(请注意,elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom行容易溢出。

(相应的POSIX函数是clock_gettime(CLOCK_MONOTINIC, &result)。目前还不清楚为什么OSX没有实现它。)

答案 3 :(得分:1)

如果是您的应用程序,只需通过您编写的具有标量的函数路由所有时间请求。要做一些类似于任意应用程序的事情,可以说注入一些代码并修补一个陷阱。我认为mach-inject仍然存在,并且还有其他类似的工具,例如ape,可以很好地面对它。即使它是您的应用程序,您也可以使用mach-inject中的方法来操纵系统时间调用的结果。

所有可可和核心基础挂钟时间调用滴入到gettimeofday。还有其他方法可以跟踪时间,但这是一个良好的开端。