strace命令学习
生活随笔
收集整理的這篇文章主要介紹了
strace命令学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? linux下strace命令是強大,今天來學習一下。利用strace命令可以追蹤系統調用和信號值。
學習用的測試代碼如下:
[root@localhost mapan]# cat test.cpp #include <iostream> using namespace std;int main() {int a;cin >> a;cout << a << endl;return 0; } [root@localhost mapan]# g++ test.cpp [root@localhost mapan]# ls a.out test.cpp [root@localhost mapan]#用strace來跟蹤信號傳遞
[root@localhost mapan]# strace ./a.out execve("./a.out", ["./a.out"], [/* 28 vars */]) = 0 brk(NULL) = 0x896000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f20000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=23944, ...}) = 0 mmap(NULL, 23944, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffbd1f1a000 close(3) = 0 open("/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \262\5\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=991616, ...}) = 0 mmap(NULL, 3171168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd19f9000 mprotect(0x7ffbd1ae2000, 2093056, PROT_NONE) = 0 mmap(0x7ffbd1ce1000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe8000) = 0x7ffbd1ce1000 mmap(0x7ffbd1ceb000, 82784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1ceb000 close(3) = 0 open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pS\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1139680, ...}) = 0 mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd16f7000 mprotect(0x7ffbd17f8000, 2093056, PROT_NONE) = 0 mmap(0x7ffbd19f7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7ffbd19f7000 close(3) = 0 open("/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220*\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=88776, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f19000 mmap(NULL, 2184192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd14e1000 mprotect(0x7ffbd14f6000, 2093056, PROT_NONE) = 0 mmap(0x7ffbd16f5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7ffbd16f5000 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P%\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2173512, ...}) = 0 mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd1114000 mprotect(0x7ffbd12d7000, 2093056, PROT_NONE) = 0 mmap(0x7ffbd14d6000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7ffbd14d6000 mmap(0x7ffbd14dc000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffbd14dc000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f18000 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f16000 arch_prctl(ARCH_SET_FS, 0x7ffbd1f16740) = 0 mprotect(0x7ffbd14d6000, 16384, PROT_READ) = 0 mprotect(0x7ffbd16f5000, 4096, PROT_READ) = 0 mprotect(0x7ffbd19f7000, 4096, PROT_READ) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f15000 mprotect(0x7ffbd1ce1000, 32768, PROT_READ) = 0 mprotect(0x600000, 4096, PROT_READ) = 0 mprotect(0x7ffbd1f21000, 4096, PROT_READ) = 0 munmap(0x7ffbd1f1a000, 23944) = 0 fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f1f000 read(0,上面都的一些系統調用都是做進程初始化工作,現在卡在read那里了,等待讀取一個數。然后打開另一個窗口kill掉這個進程,kill結果如下:
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f1f000 read(0, Killed [root@localhost mapan]#顯示killed
strace -c 統計系統調用分析的結果
[root@localhost mapan]# strace -c ./a.out 1 1 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ----------------0.00 0.000000 0 5 read0.00 0.000000 0 1 write0.00 0.000000 0 5 open0.00 0.000000 0 5 close0.00 0.000000 0 7 fstat0.00 0.000000 0 18 mmap0.00 0.000000 0 10 mprotect0.00 0.000000 0 1 munmap0.00 0.000000 0 1 brk0.00 0.000000 0 1 1 access0.00 0.000000 0 1 execve0.00 0.000000 0 1 arch_prctl ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 56 1 total [root@localhost mapan]#上面有顯示系統調用執行的次數和耗用的時間。
strace -T 打印每個系統調用所花的時間
[root@localhost mapan]# strace -T ./a.out execve("./a.out", ["./a.out"], [/* 28 vars */]) = 0 <0.000716> brk(NULL) = 0x112f000 <0.000295> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a676000 <0.000284> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000305> open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000284> fstat(3, {st_mode=S_IFREG|0644, st_size=23944, ...}) = 0 <0.000308> mmap(NULL, 23944, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f900a670000 <0.000015> close(3) = 0 <0.000008> open("/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000016> read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \262\5\0\0\0\0\0"..., 832) = 832 <0.000013> fstat(3, {st_mode=S_IFREG|0755, st_size=991616, ...}) = 0 <0.000011> mmap(NULL, 3171168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f900a14f000 <0.000014> mprotect(0x7f900a238000, 2093056, PROT_NONE) = 0 <0.000012> mmap(0x7f900a437000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe8000) = 0x7f900a437000 <0.000013> mmap(0x7f900a441000, 82784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f900a441000 <0.000016> close(3) = 0 <0.000012> open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000016> read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pS\0\0\0\0\0\0"..., 832) = 832 <0.000012> fstat(3, {st_mode=S_IFREG|0755, st_size=1139680, ...}) = 0 <0.000009> mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9009e4d000 <0.000012> mprotect(0x7f9009f4e000, 2093056, PROT_NONE) = 0 <0.000016> mmap(0x7f900a14d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7f900a14d000 <0.000015> close(3) = 0 <0.000007> open("/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000017> read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220*\0\0\0\0\0\0"..., 832) = 832 <0.000008> fstat(3, {st_mode=S_IFREG|0755, st_size=88776, ...}) = 0 <0.000008> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66f000 <0.000012> mmap(NULL, 2184192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9009c37000 <0.000010> mprotect(0x7f9009c4c000, 2093056, PROT_NONE) = 0 <0.000011> mmap(0x7f9009e4b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7f9009e4b000 <0.000012> close(3) = 0 <0.000010> open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000013> read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P%\2\0\0\0\0\0"..., 832) = 832 <0.000011> fstat(3, {st_mode=S_IFREG|0755, st_size=2173512, ...}) = 0 <0.000011> mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f900986a000 <0.000011> mprotect(0x7f9009a2d000, 2093056, PROT_NONE) = 0 <0.000015> mmap(0x7f9009c2c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7f9009c2c000 <0.000016> mmap(0x7f9009c32000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f9009c32000 <0.000010> close(3) = 0 <0.000007> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66e000 <0.000408> mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66c000 <0.000009> arch_prctl(ARCH_SET_FS, 0x7f900a66c740) = 0 <0.000007> mprotect(0x7f9009c2c000, 16384, PROT_READ) = 0 <0.000012> mprotect(0x7f9009e4b000, 4096, PROT_READ) = 0 <0.000011> mprotect(0x7f900a14d000, 4096, PROT_READ) = 0 <0.000011> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66b000 <0.000237> mprotect(0x7f900a437000, 32768, PROT_READ) = 0 <0.000011> mprotect(0x600000, 4096, PROT_READ) = 0 <0.000011> mprotect(0x7f900a677000, 4096, PROT_READ) = 0 <0.000012> munmap(0x7f900a670000, 23944) = 0 <0.000016> fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 <0.000303> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a675000 <0.000013> read(0,brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x112f000 <0.000295>? ? ? ? ?0.000295就是對于brk系統調用所花的時間
fstat(3, {st_mode=S_IFREG|0644, st_size=23944, ...}) = 0 <0.000308>? ? ?0.000308就是對于fstat系統調用所花的時間
strace -i 輸出系統調用的入口指針,還可以顯示具體在那個地址上進行調用 ,可以用來調試coredump
詳細見:https://blog.csdn.net/ma2595162349/article/details/51472328
strace -p 調試進程下篇講
總結
以上是生活随笔為你收集整理的strace命令学习的全部內容,希望文章能夠幫你解決所遇到的問題。