我正在学习如何使用英特尔Pin,我对特定用例的仪器过程有几个问题。我想创建一个简单的数据包处理应用程序的内存引用跟踪。我为此目的开发了所需的pintool,我的问题如下。
假设我始终使用相同的网络数据包跟踪作为我的数据包处理应用程序的输入,假设我在两台不同的机器上检测相同的应用程序。内存参考曲线如何不同?显然Pin工具用户空间与架构无关,因此我不希望在两个输出存储器参考轨迹中看到很大的质量差异。这个假设是否正确?
如果我试验将网络数据包注入数据包处理应用程序的速率,内存跟踪将如何变化?或者它会改变吗?如果是,我如何检测输出轨迹的差异?
谢谢
答案 0 :(得分:1)
我假设您正在做一些与跟踪网络数据包的数据流/代码流有关的事情,可能与数据污染密切相关?
假设我始终使用相同的网络数据包跟踪作为我的数据包处理应用程序的输入,并假设我在两台不同的计算机上使用相同的应用程序。内存参考曲线如何不同?
有多种因素可以使内存跟踪跟踪完全不同,关键点是“两台不同的机器”:
相同的O.S:跟踪的完全副本几乎相同(因为堆栈,堆和虚拟内存管理器将工作相同),除了地址将更改(ASLR)。
相同的O.S(但不一定是系统共享库的相同版本):如果没有重新编译目标应用程序,可能与上面相同。由于堆管理器可能表现不同,可能存在细微差别。
不同的O.S(需要重新编译跟踪的应用程序):完全不同的痕迹。
显然Pin仪器用户空间与架构无关,因此我不希望在两个输出存储器参考轨迹中看到很大的质量差异。这个假设是否正确?
Pintools需要针对不同的arch重新编译,但pintool本身不应该改变目标应用程序的跟踪方式(相同的pintool +相同的os +相同的应用程序=几乎相同的跟踪)。
如果我试验将网络数据包注入数据包处理应用程序的速率,内存跟踪将如何变化?
这取决于系统,也取决于您的插入点。如果您在recv()
或recvfrom()
开始跟踪,则可能存在一些拥塞或丢弃的数据包(UDP),例如,如果速率太重要。取决于协议,接收窗口等。这里有很多因素。
或者它会改变吗?如果是,我如何检测输出走线的差异?
我可能会检查代码流而不是这种情况下的数据流(对我来说似乎更容易)。给定完全相同的数据包但速率不同,如果代码分支不相同(可能在基本块(BBL)级别),则会立即告知相同的数据包处理方式不同。