[daily] 查看linux程序或操作的kernel內核調用棧


[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

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Developer_Guide/ftrace.html

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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM