我听说这个术语在与日志记录相同的上下文中使用了很多,但我似乎无法找到它实际上是什么的明确定义。
它只是一类更通用的日志记录/监控工具和活动吗?
请在何时/如何使用仪器时提供示例代码/方案。
答案 0 :(得分:14)
我编写了执行检测的工具。所以这就是我的想法。
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调用的风险这是你刚刚暂停的一个帖子 - 你不想这样做,你会陷入僵局。您还必须检查是否有任何其他线程正在执行该方法,因为如果它们是您无法修改它。
基于虚拟机的检测方法更容易使用,因为虚拟机保证您可以安全地修改代码。
我想我已经涵盖了所有这些,希望有所帮助。
答案 1 :(得分:6)
这是为您的代码做一些事情的一般术语,这是进行进一步分析所必需的。
特别是对于像C或C ++这样的语言,有一些工具,如Purify或Quantify,可以分析内存使用情况,性能统计数据等。为了使这些分析程序正常工作,需要一个“检测”步骤来插入分析程序使用的计数器,数组边界检查等。请注意,在Purify / Quantify场景中,检测是作为编译后步骤自动完成的(实际上,它是链接过程的一个额外步骤),您不需要触摸源代码。
对于动态代码或VM代码,其中一些不太必要(例如,OptimizeIt等分析工具可用于完成Quantify所做的很多工作,但不需要特殊的链接),但这并没有否定这个概念。 / p>
答案 2 :(得分:4)
仪器通常用于动态代码分析。
它与日志记录不同,因为仪器通常由软件自动完成,而日志记录需要人工智能来插入日志记录代码。
答案 3 :(得分:4)
摘自wikipedia文章
在计算机编程的背景下,仪器指的是 能够监控或衡量产品的性能水平 诊断错误并写入跟踪信息。程序员实现 以监控特定的代码指令形式的检测 系统中的组件(例如,指令可能会输出日志记录 信息显示在屏幕上)。当应用程序包含时 仪表代码,可以使用管理工具进行管理。 仪表是审查性能的必要条件 应用。仪表方法可以是两种类型,源 仪器仪表和二进制仪表。
答案 4 :(得分:-1)
无论Wikipedia怎么说, IT行业中都没有标准的/广泛认可的定义 代码工具。
请考虑 instrumentation 是从 instrument 派生的名词,其含义非常广泛。
“ 代码”也是IT中的一切,我的意思是-数据,服务,一切。
因此,代码检测是一系列应用程序,其用途非常广泛……不值得为其单独命名;-)。
这可能就是为什么这篇Wikipedia文章只是一个存根。