[daily] 查看linux程序或操作的kernel内核调用栈

[classic_tong @ https://www.cnblogs.com/hugetong/p/12198122.html]

查看一个命令或程序,都调用了什么系统API的方法,

可以是用strace

[[email protected] 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

[[email protected] 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

┬─[[email protected]:~/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]

原文地址:https://www.cnblogs.com/hugetong/p/12198122.html

时间: 2024-11-05 18:46:19

[daily] 查看linux程序或操作的kernel内核调用栈的相关文章

android native HAL程序 java程序 linux kernel打印调用栈的方法

android native HAL程序 java程序 linux kernel打印调用栈的方法 关于android java打出调用栈的方法 1)方法一:refs:frameworks/base/services/java/com/android/server/ActivityManagerService.javastartProcessLocked(){Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "amProcessStart&quo

查看Linux系统多少位,内核版本,系统版本

[root@localhost ~]# uname -aLinux localhost.localdomain 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 内核版本:2.6.32   64位 [root@localhost ~]# lsb_release -aLSB Version:    :base-4.0-amd64:base-4.0-noarch:core-

查看linux程序加载so文件的位置

最近安装公司新产品,安装的时候发现加载的so文件不对,于是开始找问题,到底加载的是谁? 1 使用ldconfig -p|grep linkfileName 比如:查看共享的ssl动态库:路径 2 使用ldd programName 查看程序使用的静态连接库 3 使用程序信息,查看加载后的so文件位置 sudo cat /proc/25156/maps | awk '{print $6}' | grep '\.so' | sort | uniq 其中25156为程序运行的PID,如下查看mysql

利用pwdx查看Linux程序的工作目录

Linux中的pwdx命令,利用进程号作为参数,可以打印出指定进程号的工作目录,帮助我们区分不同的进程. pwdx <pid> [[email protected] ~]$ pwd 32277/home/hnyundev 打印进程号为32277的进程工作目录,结果为该进程的工作目录. 原文地址:https://www.cnblogs.com/python-xiakaibi/p/11465233.html

Linux内核学习--写一个c程序,并在内核中编译,运行

20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,"忍不住"跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直接从代码入手,下面来写一个hello.c内核模块. 说明: 这个路径/usr/src/linux-headers-2.6.32-22/include/linux是引用的头文件. 内核模块固定格式:module_init()/ module_exit(),module函数是从头文件中来的.

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

Ubuntu下查看linux版本,内核版本,系统位数,gcc版本

1. 查看linux版本  [email protected]:~$cat /etc/issueUbuntu 11.04 \n \l 2. 查看内核版本1) [email protected]:~$ cat /proc/versionLinux version 2.6.38-13-generic ([email protected]) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) ) #57-Ubuntu SMP Mon Mar 5 18:1

查看Linux系统版本和内核信息

Linux 查看Linux系统版本信息 1. 查看内核版本 1) 方法一:登录到linux执行cat /proc/version [[email protected]_32bit_ip12 ~]$ cat /proc/version  Linux version 2.6.18-194.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:35 EDT 2010