Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中进程/函数调用指令大小的确定_Linux_Linux Kernel_Valgrind_Perf - Fatal编程技术网

Linux中进程/函数调用指令大小的确定

Linux中进程/函数调用指令大小的确定,linux,linux-kernel,valgrind,perf,Linux,Linux Kernel,Valgrind,Perf,我想确定一个核心完成一个过程需要多少指令。有办法确定吗?因此,在微控制器中,您可以确定函数的指令大小,我希望在Linux中也这样做。提前谢谢 编辑:[已解决] 最适合我的申请是 perf stat -p <pid> perf stat-p 及 性能统计 有多种方法可以做到这一点: []$ readelf -s /usr/lib64/libc.so.6|grep usleep 1542: 00000000000f9090 57 FUNC GLOBAL DEFAULT

我想确定一个核心完成一个过程需要多少指令。有办法确定吗?因此,在微控制器中,您可以确定函数的指令大小,我希望在Linux中也这样做。提前谢谢

编辑:[已解决] 最适合我的申请是

perf stat -p <pid>
perf stat-p

性能统计
有多种方法可以做到这一点:

[]$ readelf -s /usr/lib64/libc.so.6|grep usleep
  1542: 00000000000f9090    57 FUNC    GLOBAL DEFAULT   12 usleep@@GLIBC_2.2.5
  1560: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS usleep.c
  7073: 00000000000f9090    57 FUNC    GLOBAL DEFAULT   12 usleep

[]$ objdump -t /usr/lib64/libc.so.6|grep usleep
0000000000000000 l    df *ABS*  0000000000000000              usleep.c
00000000000f9090 g     F .text  0000000000000039              usleep

[]$ nm -S /usr/lib64/libc.so.6|grep usleep
00000000000f9090 0000000000000039 T usleep
所有情况下的大小均为0x39(57)字节

如果需要给定函数的指令数,仍然可以使用objdump:

[]$ objdump -d /usr/lib64/libc.so.6 | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /usleep/;'
…将列出拆解。对于需要减去行计数的确切指令数:

[]$ echo $(objdump -d /lib32/libc.so.6 | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /usleep/;'|wc -l)-2| bc -l
对于动态解决方案,您可以使用perf stat:

[]$ perf stat uptime
 10:57:28 up 21 days, 10:30,  4 users,  load average: 2.00, 1.98, 2.16

 Performance counter stats for 'uptime':

          0.719094      task-clock (msec)         #    0.802 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               123      page-faults               #    0.171 M/sec                  
         2,297,093      cycles                    #    3.194 GHz                    
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
         1,985,122      instructions              #    0.86  insns per cycle        
           389,193      branches                  #  541.227 M/sec                  
            15,847      branch-misses             #    4.07% of all branches        

       0.000896079 seconds time elapsed
[]$perf stat正常运行时间
10:57:28最多21天,10:30,4个用户,平均负载:2.00、1.98、2.16
“正常运行时间”的性能计数器统计信息:
0.719094任务时钟(毫秒)#使用了0.802个CPU
0个上下文开关#0.000 K/sec
0 cpu迁移#0.000 K/sec
123页错误#0.171米/秒
2297093个周期#3.194 GHz
停止循环前端
暂停周期后端
1985122指令#每周期0.86 INSN
389193分支机构#541.227米/秒
15847家分支机构未命中,占所有分支机构的4.07%
0.000896079秒经过的时间

如果您多次运行命令,您很可能会看到值在运行之间波动。因此,这不是一门精确的科学。

有多种方法可以做到这一点:

[]$ readelf -s /usr/lib64/libc.so.6|grep usleep
  1542: 00000000000f9090    57 FUNC    GLOBAL DEFAULT   12 usleep@@GLIBC_2.2.5
  1560: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS usleep.c
  7073: 00000000000f9090    57 FUNC    GLOBAL DEFAULT   12 usleep

[]$ objdump -t /usr/lib64/libc.so.6|grep usleep
0000000000000000 l    df *ABS*  0000000000000000              usleep.c
00000000000f9090 g     F .text  0000000000000039              usleep

[]$ nm -S /usr/lib64/libc.so.6|grep usleep
00000000000f9090 0000000000000039 T usleep
所有情况下的大小均为0x39(57)字节

如果需要给定函数的指令数,仍然可以使用objdump:

[]$ objdump -d /usr/lib64/libc.so.6 | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /usleep/;'
…将列出拆解。对于需要减去行计数的确切指令数:

[]$ echo $(objdump -d /lib32/libc.so.6 | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /usleep/;'|wc -l)-2| bc -l
对于动态解决方案,您可以使用perf stat:

[]$ perf stat uptime
 10:57:28 up 21 days, 10:30,  4 users,  load average: 2.00, 1.98, 2.16

 Performance counter stats for 'uptime':

          0.719094      task-clock (msec)         #    0.802 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               123      page-faults               #    0.171 M/sec                  
         2,297,093      cycles                    #    3.194 GHz                    
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
         1,985,122      instructions              #    0.86  insns per cycle        
           389,193      branches                  #  541.227 M/sec                  
            15,847      branch-misses             #    4.07% of all branches        

       0.000896079 seconds time elapsed
[]$perf stat正常运行时间
10:57:28最多21天,10:30,4个用户,平均负载:2.00、1.98、2.16
“正常运行时间”的性能计数器统计信息:
0.719094任务时钟(毫秒)#使用了0.802个CPU
0个上下文开关#0.000 K/sec
0 cpu迁移#0.000 K/sec
123页错误#0.171米/秒
2297093个周期#3.194 GHz
停止循环前端
暂停周期后端
1985122指令#每周期0.86 INSN
389193分支机构#541.227米/秒
15847家分支机构未命中,占所有分支机构的4.07%
0.000896079秒经过的时间

如果您多次运行命令,您很可能会看到值在运行之间波动。因此,这不是精确的科学。

完成这个汇编语言程序需要多少指令:
jmp$
?完成这个汇编语言程序需要多少指令:
jmp$
?您好,谢谢您的回答。是我弄错了还是尺寸不应该是一个单位?我的意思是,我想获得指令计数。有可能得到吗?对不起。我已经详述了我的答案,非常感谢。请再说一件事,对于python或其他通过命令从终端运行的应用程序,我如何才能找到指令计数?感谢..对于Python和其他解释语言或在虚拟机中运行的语言,很难确定指令计数。它可能也不是很有用,因为它甚至可能根据环境或VM语言的预编译或JIT编译在不同的运行中有所不同。不过,我已经用动态解决方案更新了答案。非常感谢。这似乎适用于大多数情况。但我还有一个问题。是否可以在正在运行的进程上运行这样的命令,并查看它在一段时间内运行的指令数。(我想能够开始和停止指令计数)再次感谢。你好,谢谢你的回答。是我弄错了还是尺寸不应该是一个单位?我的意思是,我想获得指令计数。有可能得到吗?对不起。我已经详述了我的答案,非常感谢。请再说一件事,对于python或其他通过命令从终端运行的应用程序,我如何才能找到指令计数?感谢..对于Python和其他解释语言或在虚拟机中运行的语言,很难确定指令计数。它可能也不是很有用,因为它甚至可能根据环境或VM语言的预编译或JIT编译在不同的运行中有所不同。不过,我已经用动态解决方案更新了答案。非常感谢。这似乎适用于大多数情况。但我还有一个问题。是否可以在正在运行的进程上运行这样的命令,并查看它在一段时间内运行的指令数。(我想能够开始和停止指令计数)再次感谢。