我正在使用pinatrace.so工具对R程序进行检测,以生成用于读取和写入内存指令的跟踪。我观察到的是,多个#eof语句在跟踪文件中的不同位置打印(实际上应该只在跟踪末尾打印)。另外,#eof之后的下一行会变形,并且不能正确打印。
我正在使用以下命令调用R Shell和我的R程序:
../../../ pin -follow_execv -t obj-intel64 / pinatrace.so-/home/R-3.5.3./bin/R -f hello.R
跟踪文件如下所示打印:
0 0x7ffc812cd1c8
1 0x7ffc812cd1c8
0 0x7f7f8555ee78
#eof
f6971ce8
1 0x6f4518
0 0x7ffc171a0b70
...
...
1 0x7ffc6da8f078
0 0x7f7c38786e78
#eof
ffc171a07c8
0 0x6f4e30
0 0x6ff918
此仪器有什么问题?
答案 0 :(得分:1)
使用follow_execv旋钮调用Pin时,它将在创建的每个子进程中创建其自身的新副本。新副本不知道另一个副本正在父级中运行或根本没有运行。参见here:
如果启用了-follow_execv并且用户尚未注册以获取通知,则将使用与当前进程相同的命令行将Pin注入到子进程/ exec执行的进程中。
如果未在使用-follow_execv的情况下创建Pintool,则Pintool的所有副本通常都将写入同一文件。由于不同的进程将写入相同的文件,并在终止符之后的其他进程正在写入该文件的同时将其终止,因此这会创建奇怪的工件,例如您所看到的。
最简单的解决方案是在文件中添加PID后缀,另一种选择是使用“跟随子进程API”(上面链接)来确定哪个子进程是您要跟踪的实际R程序。最后,R可能支持检测,您可以使用它来检测程序本身。