我们正在尝试使用pin工具收集Java程序的指令跟踪。但是,我们无法理解java程序中某些pin工具的某些行为。
我们尝试了两个示例程序进行比较:java_helloworld
(这是一个简单的hello world程序)和c_simplefork
(这是一个简单的C程序,可以分析子进程)。
- follow_execv命令行开关:它使用Pin执行execv类系统调用产生的所有进程。但事实并非如此 以预期的方式为java程序工作。我们观察了一个 在inscount和itrace pin的输出中的矛盾行为 工具。然而,我们甚至观察到了预期的线性趋势 inscount工具与素数的follow_execv开关一起使用 计算程序与itrace工具的情况不同。 inscount和itrace工具是否考虑了不同的类型 他们每个人的说明?
- PIN_AddFollowChildProcessFunction应该在创建子项时调用辅助函数。在这里,如果我们运行c_simplefork,它 但是,正确报告子进程的进程ID java_helloworld没有。显然,java_helloworld也应该有 显示正确的子进程ID,因为它也执行克隆系统 呼叫。我们注意到了strace中clone()系统调用的参数 两个程序的输出。对于java_helloworld CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID。对于 c_simplefork - CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | SIGCHLD。 所以,这种行为是由于参数的差异造成的 clone()调用两个代码?
- fork_jit_tool:
醇>
on java_helloworld -
with follow_execv - 不会进入每个FPOINTS执行的任何方法
没有follow_execv - 与上面相同
在c_simplefork上 -
用 follow_execv - 进入每个FPOINTS执行的所有3个方法 并打印正确的子进程ID。
没有 follow_execv - 与上面相同
为什么java程序不输入 在每个FPOINTS上执行的方法,即使它实际上也是如此 催生了一个儿童过程?