Jon*_*gel 25 language-agnostic instrumentation definition
我听说这个术语在与日志记录相同的上下文中使用了很多,但我似乎无法找到它实际上是什么的明确定义.
它只是一个更一般的日志/监控工具和活动类吗?
请在何时/如何使用仪器时提供示例代码/方案.
Ste*_*ett 16
我编写了执行检测的工具.所以这就是我认为的.
DLL重写.这就是Purify和Quantify这样的工具.之前对此问题的回复称,他们会对后编译/链接进行检测.这是不正确的.在编译/链接循环后第一次执行时,对DLL进行Purify和Quantify检测,然后缓存结果,以便下次可以更快地使用它.对于大型应用程序,分析DLL可能非常耗时.这也是有问题的 - 在1998-2000之间我工作的一家公司,我们有一个200万行的大型应用程序需要4个小时的仪器,其中2个DLL会在仪表期间随机崩溃,如果要么失败你就会删除他们两个,然后重新开始.
到位仪器.这与DLL重写类似,不同之处在于未修改DLL并且磁盘上的映像保持不变.首次加载DLL时(无论是在启动期间还是在调用LoadLibrary(Ex)之后)DLL函数都适当地挂钩.您可以在Microsoft Detours库中看到与此类似的技术.
即时仪表.与就地类似,但实际上只在第一次执行方法时对方法进行检测.这比就地更复杂,并且在第一次遇到该方法之前延迟了仪器惩罚.根据你正在做的事情,这可能是件好事还是坏事.
中级语言工具.这是Java和.Net语言(C~,VB.Net,F#等)经常使用的.语言被编译为中间语言,然后由虚拟机执行.虚拟机提供了一个接口(JVMTI for Java,ICorProfiler(2)for .Net),允许您监视虚拟机正在执行的操作.其中一些选项允许您在编译为可执行指令之前修改中间语言.
通过反思进行中级语言检测.Java和.Net都提供反射API,允许发现有关方法的元数据.使用此数据,您可以动态创建新方法并检测现有方法,就像前面提到的中间语言检测一样.
编译时间检测.编译时使用此技术在编译期间将适当的指令插入应用程序.不经常使用,Visual Studio的分析功能提供此功能.需要完整的重建和链接.
源代码检测.此技术用于修改源代码以插入适当的代码(通常是有条件编译的,因此您可以将其关闭).
链接时间检测.此技术仅对使用跟踪分配器替换默认内存分配器非常有用.早期的一个例子是20世纪90年代早期的Solaris/HP上的Sentinel内存泄漏检测器.
各种就地和即时检测方法充满了危险,因为很难安全地停止所有线程并修改代码而不会冒可能需要访问可能需要访问锁的API的风险通过你刚刚暂停的一个帖子 - 你不想这样做,你会陷入僵局.您还必须检查是否有任何其他线程正在执行该方法,因为如果它们是您无法修改它.
基于虚拟机的检测方法更易于使用,因为虚拟机可确保您可以安全地修改代码.
我想我已经覆盖了所有这些,希望有所帮助.
这是对您的代码执行某些进一步分析所必需的一般术语.
特别是对于像C或C++这样的语言,有像Purify或Quantify这样的工具可以分析内存使用情况,性能统计数据等.为了使这些分析程序正常工作,需要一个"检测"步骤来插入分析程序使用的计数器,数组边界检查等.请注意,在Purify/Quantify场景中,检测是作为编译后步骤自动完成的(实际上,这是链接过程的一个额外步骤),并且您不会触及源代码.
其中一些不太适用于动态代码或VM代码(例如,OptimizeIt等分析工具可用于Java,它可以完成Quantify所做的很多工作,但不需要特殊的链接),但这并没有否定这个概念.