我正在使用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
这个工具出了什么问题?
发布于 2019-09-02 04:16:32
当使用follow_execv旋钮调用Pin时,它将在创建的每个子进程中创建其自身的新副本。新副本不知道另一个副本正在父副本中运行,或者根本不知道。请参阅here
如果启用了-follow_execv,并且用户尚未注册接收通知,则Pin将使用与当前进程相同的命令行注入到子进程/执行进程中。
如果拼接工具在创建时没有考虑到-follow_execv,那么拼接工具的所有副本通常都会写入同一个文件。这将创建奇怪的工件,例如您所看到的,因为不同的进程写入相同的文件并终止该文件,而其他进程正在写入终止符之后。
最简单的解决方案是向文件添加PID后缀,另一种选择是使用Follow Child Process API (上面链接)来确定哪个子进程是您想要跟踪的实际R程序。最后,R可能支持插装,您可以使用它来插装程序本身。
https://stackoverflow.com/questions/57737261
复制相似问题