如果还没有为 synprog 收集性能数据,必须进行收集。相关说明参见为 synprog 示例收集数据。收集了性能数据之后,就必须打开实验 test.1.er。
示例的此部分说明性能分析器如何显示共享对象的信息,以及如何调用可以在不同位置、不同时间加载的动态链接共享对象中的函数。
synprog 目录包含两个动态链接共享对象,分别为 so_syn.so 和 so_syx.so。在执行过程中,synprog 先加载 so_syn.so,调用其函数之一 so_burncpu()。然后卸下 so_syn.so,在相同地址加载 so_syx.so,调用 so_syx.so 函数之一 sx_burncpu()。然后,不卸下 so_syx.so,而再次加载 so_syn.so 并再次调用 so_burncpu()。由于 so_syx.so 仍在使用第一次加载 so_syn.so 的地址,因此这次会在不同地址加载 so_syn.so。
加载共享对象的地址在运行时确定,运行时加载程序选择地址来加载对象。
本示例说明,在程序执行期间,可在不同时间、不同地址调用相同的函数;在相同的地址可以调用不同的函数;性能分析器正确处理收集函数数据的操作,而不考虑函数在何处出现。
[显示/隐藏函数] 对话框列出程序运行时使用的所有加载对象。
除了两个选定的对象之外,所有加载对象的函数都不再出现在函数列表中。它们的条目替换为整个加载对象的单个条目。
[函数] 标签中的加载对象列表只包括已记录了度量的加载对象,因此该列表可能比 [显示/隐藏函数] 对话框中的列表短。
so_burncpu() 会执行与 sx_burncpu() 相同的操作。由于执行了两次 so_burncpu(),因此 so_burncpu() 的用户 CPU 时间几乎是 sx_burncpu() 的用户 CPU 时间的两倍。
即使程序执行过程中同一函数在两个不同的地址出现,性能分析器也能够识别出此函数正在执行,并能收集其数据。