示例代码:
主函数基本就是打印一句log,但是运行时卡了很久(为了演示方便,我只加了一个头文件,实际情况比这个复杂,可能是各种头文件加载)。
#include <sys/file.h>
#include <sys/syscall.h>
#include "mydata.hpp"
int main(int argc,char *argv[])
{
printf("global value is %d \n",globalValue1.value);
}
分析步骤
1.确认是否是linker的so库太大,io慢导致。objdump -x bin,一般会有下面的打印:
这些是需要link的库,我们可以手动cat一下这些库,确保他们都在文件缓存中,然后再启动,确认是否速度提升,如果提升,推论成立。反之,推论不成立。
2.如果不是IO的问题,那我们需要确认是否是linke函数过多。用dlopen函数逐个open一下这些so库,看一下每个so库耗时。如果有一个so库耗时比较长,那这个推论基本就OK了。
3.最后一种可能是全局变量的构造函数初始化数据耗时,导致整个__init函数非常慢。我们看一下怎么推
objdump -S bin,然后找到__cxx_global_var_init,一个全局变量对应一个__cxx_global_var_init,所以这里有2个
我们看一下
adrp x8 0x1000,就是当前pc指针低12位清空,然后加上0x1000给到x8 =》实际就是相对寻址改为0x1000
add x8,x8,#240,就是x8再机上240,那相对地址就是0x10F0
blr x8,跳转到x8,就是跳转到0x10F0
我们看一下相对地址10F0是多少
是_ZN6MyDataC2Ev的函数开头,用c++filt翻译一下这个函数
就是MyData的构造函数,再用addr2line看一下这个函数在那里
我们这样就找到了需要全局变量初始化函数位置,按照这个方法找到所有函数,然后打印log,这样我们就能知道具体是哪个初始化慢了。