关于KnobOutputFile()函数的解释
对于KnobOutputFile()这个函数我在网上很少能找到对他的详细解释,今天好好的研究了一下,顺便记录下来。
首先对这个函数的第一映像是,为啥文件的创建要用这么个鬼东西。如果我们回顾一下如何声明文件名变量KnobOutputFile,也会觉得我们为什么要为这种情况创建这么复杂的东西很奇怪。KnobOutputFile是一个在Intel pin内定义的类型选择器,用于自动解析和管理命令行开关。我们想在不同的测试执行中使用不同的文件名;最好的方法是用命令行发送文件名。由于选择器的存在,我们现在可以在命令行中发送文件名,如下所示:
Example 1 ../../../pin -t obj-intel64/inscount0.so -o pininscount.out -- /bin/ls
Example 2 ../../../pin -t obj-intel64/inscount0.so -- /bin/ls ..
因此,指令计数现在将存储在pininscount.out中,而不是inscount.out;唯一的区别是我们在这里包括-o filename,我们甚至不需要在源代码中做任何更改就可以覆盖默认的文件名。那么,如果我们想从命令行发送这样的多个信息,pin如何解析文件名呢?仔细看看KnobOutputFile的声明。
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "inscount.out", "specify output file name");
这第一个参数是KNOB_MODE_WRITEONCE,意思就是我们只打开文件写入一次。而这个参数还有其他好几个选项:
参数名 | 作用 |
---|---|
KNOB_MODE_WRITEONCE | 单个值,单次写入 |
– | – |
KNOB_MODE_OVERWRITE | 单个值,用户在命令行执行时可覆盖写入 |
– | – |
KNOB_MODE_ACCUMULATE | 单个值,可更新写入,但是不覆盖 |
– | – |
KNOB_MODE_APPEND | 一系列值,叠加写入 |
但目前只用的到第一个参数。
之后,“pintool”说明了这个文件应该包含在哪一类家族中。然后使用了“o”,它作为一个pin tool标识,这个标识建议pin tool在命令行中,-o之后将是这个文件变量的期望字符串。可以看上面的例子是如何替换默认文件名的(-o pininscount.out)。最后一个参数只是给用户一个建议,如果需要这个字段,就在命令行中提供。在这种情况下,我们提供了一个默认文件名“inscount”。作为第四个参数。