Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Intel PIN捕获阵列的所有负载?_C++_Assembly_Profiling_Intel Pin - Fatal编程技术网

C++ 如何使用Intel PIN捕获阵列的所有负载?

C++ 如何使用Intel PIN捕获阵列的所有负载?,c++,assembly,profiling,intel-pin,C++,Assembly,Profiling,Intel Pin,我正在分析我使用PIN编写的应用程序。应用程序的源代码使用数组-我希望PIN捕获对数组执行的每个加载指令 目前,我已经注释了我试图分析的应用程序的源代码。每次读取数组时,我首先调用函数startregionofindertest()。从数组中读取完毕后,我调用另一个函数endRegionFinterest()。我可以使用PIN轻松捕获对这两个函数的调用——只要这两个调用之间存在负载,我就假定这是我感兴趣的数组的负载 然而,这是相当粗粒度的,因此我最终将许多不属于感兴趣的数组的负载分类为对数组的读

我正在分析我使用PIN编写的应用程序。应用程序的源代码使用数组-我希望PIN捕获对数组执行的每个加载指令

目前,我已经注释了我试图分析的应用程序的源代码。每次读取数组时,我首先调用函数startregionofindertest()。从数组中读取完毕后,我调用另一个函数endRegionFinterest()。我可以使用PIN轻松捕获对这两个函数的调用——只要这两个调用之间存在负载,我就假定这是我感兴趣的数组的负载

然而,这是相当粗粒度的,因此我最终将许多不属于感兴趣的数组的负载分类为对数组的读取


是否有更简单的方法可以更精确地捕获我感兴趣的数组的所有加载?

在您的
startregionofindertest
方法中,您可以使用某种指示符序列将数组地址传递给PIN工具。例如,存储一个魔常数,然后存储数组地址,类似于:

volatile void *sink;

void startRegionOfInterest(void *array) {
    sink = (void *)0x48829d2f384be;
    sink = array;
}
在PIN工具中,查找magic常量的存储(如果需要,可以在
startregionoffinterest
调用中寻找额外的特殊性),然后知道下一个存储是数组的地址。你也可以用同样的方法来传达长度


相反,使用内联asm实现序列可以消除与编译器和优化器行为相关的可变性,尽管我认为
volatile
方法在实践中应该是可行的(虽然您可能必须跳过一些插入的非存储指令。A.

我假设您知道数组的地址和长度?我不太清楚PIN,但它可能会解码指令,从寻址模式中找出有效地址。@PeterCordes我有数组的长度,但如何检索地址using PIN?如果它是静态分配的,则应该有一个与之相关联的符号。如果不是,则需要找到以某种方式加载地址的加载。如果您知道编译器使用的是特定的寻址模式,则可以使用该模式。一些恰好与某个特定构建相匹配的脆弱内容可以一次性使用。可能是一个标记像一个特定的NOP编码可以帮助你用PIN找到它。听起来你需要在你的问题中更多的细节,关于你的程序如何访问这个数组,以及它是什么类型的数组。谢谢,这应该可以工作,但我最后做的是在我正在分析的程序中编写一个函数,将数组的开始和结束地址作为参数然后,我通过检测所有函数调用在Pin中找到这个函数,并读取参数以查找数组的开始和结束地址。