Linux中进程/函数调用指令大小的确定
我想确定一个核心完成一个过程需要多少指令。有办法确定吗?因此,在微控制器中,您可以确定函数的指令大小,我希望在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
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编译在不同的运行中有所不同。不过,我已经用动态解决方案更新了答案。非常感谢。这似乎适用于大多数情况。但我还有一个问题。是否可以在正在运行的进程上运行这样的命令,并查看它在一段时间内运行的指令数。(我想能够开始和停止指令计数)再次感谢。