一
[classic_tong @ https://www.cnblogs.com/hugetong/p/12198122.html]
查看一個命令或程序,都調用了什么系統API的方法,
可以是用strace
[root@T9 OUTPUT_nginx]# strace echo execve("/usr/bin/echo", ["echo"], [/* 22 vars */]) = 0 brk(NULL) = 0x1311000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f10f71d4000 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=53652, ...}) = 0 mmap(NULL, 53652, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f10f71c6000 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\0\340$\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2151672, ...}) = 0 mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f10f6be7000 mprotect(0x7f10f6da9000, 2097152, PROT_NONE) = 0
二
查看一個正在運行的程序的調用棧
在紅帽系的話,可以用紅帽給gdb打的補丁,gstack:https://src.fedoraproject.org/rpms/gdb/blob/master/f/gdb-6.3-gstack-20050411.patch
[root@T9 OUTPUT_nginx]# gstack 1 #0 0x00007f5924fad483 in epoll_wait () from /lib64/libc.so.6 #1 0x00005582a86c3ae9 in sd_event_wait () #2 0x00005582a86c45fd in sd_event_run () #3 0x00005582a86250c3 in manager_loop () #4 0x00005582a86195fb in main ()
其他地方,還可以用pstack https://code.lm7.fr/robotux/pstack
┬─[tong@T7:~/Src/go/src/github.com/cmpxchg16/gobench]─[05:58:39 PM] ╰─>$ sudo pstack 1 1: /usr/lib/systemd/systemd --switched-root --system --deserialize 28 (No symbols found) 0x7f09c0b0060e: ???? (55d405e91340, 0, 7ffd04515c90, 55d4057163a7, 7ffd04515d80, 7ffd04515d7a) + ffffd5d70197beb0 0x7f09c084444c: ???? (55d405e8eab0, 55d405f0e920, 3500000002, 55d405f07130, 55d405f27da0, 59c2fce020610) + ffffaa2ffa16e55b crawl: Input/output error Error tracing through process 1 0xffffffff: ????⏎
三
現在進入正題,查看一個程序或操作的內核調用棧
使用trace-cmd,如他自己所說,是ftrace的用戶態前端:user-space front-end command-line tool for Ftrace
ftrace是內核的調試手段,用法稍有些復雜:詳見:
https://www.kernel.org/doc/Documentation/trace/ftrace.txt,
trace-cmd就相對非常簡單,如下:
分兩步,先record,可以針對正運行的程序,或一次性運行的程序。
trace-cmd record -p function -P 10493 或 trace-cmd record -p functon -F cat /sys/class/net/lan0/statistics/rx_bytes
他們會在本地存儲一個文件,trace.dat
如下命令,可以查看在內核中的調用棧
trace-cmd report
[classic_tong @ https://www.cnblogs.com/hugetong/p/12198122.html]
