首页 > 其他分享 >crash查看percpu变量在每个cpu上的基地址和内容

crash查看percpu变量在每个cpu上的基地址和内容

时间:2024-09-03 23:25:52浏览次数:6  
标签:crash struct percpu single call data cpu


查看percpu变量在每个cpu上的基地址 

crash> kmem -o
PER-CPU OFFSET VALUES:
  CPU 0: ffff88807f600000
  CPU 1: ffff88807fa00000
  CPU 2: ffff88813d600000
  CPU 3: ffff88813da00000
  CPU 4: ffff8881bd600000
  CPU 5: ffff8881bda00000
  CPU 6: ffff88823d600000
  CPU 7: ffff88823da00000

查看一个全局的percpu变量的具体值

查看call_single_queue在每个cpu上的地址: 

static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue);

查看这个percpu变量在每个cpu上的地址

crash> p call_single_queue
PER-CPU DATA TYPE:
  struct llist_head call_single_queue;
PER-CPU ADDRESSES:
  [0]: ffff0102ffddb740
  [1]: ffff0102ffdfe740
  [2]: ffff0102ffe21740
  [3]: ffff0102ffe44740
  [4]: ffff0102ffe67740
  [5]: ffff0102ffe8a740
  [6]: ffff0102ffead740
  [7]: ffff0102ffed0740
  [8]: ffff0102ffef3740
  [9]: ffff0102fff16740
  [10]: ffff0102fff39740
  [11]: ffff0102fff5c740
....

查看某个地址上对应结构体的内容用struct命令:

NAME
  struct - structure contents

SYNOPSIS
  struct struct_name[.member[,member]][-o][-l offset][-rfuxdp]
         [address | symbol][:cpuspec] [count | -c count

例如:struct 结构体名 地址:#percpu 读取第#percpu个 percpu 的内容

或者*指令:

crash> help *
NAME
   * - pointer-to short-cutSYNOPSIS
   * (struct or union command arguments)DESCRIPTION
   This command is a short-cut command that replaces the requirement to enter
   "struct" or "union" command names.  For details on the arguments to
   those commands, enter "help struct" or "help union".EXAMPLES
   Dump the page structure at address c02943c0:
  
     crash> *page c02943c0
     struct page {
       next = 0xc0fae740, 
       prev = 0xc0018fb0, 
       inode = 0x0, 
       offset = 0x3f000, 
       next_hash = 0xc02d6310, 
       count = {
         counter = 0x1
       }, 
       flags = 0x310, 
       wait = 0xc02943d8, 
       pprev_hash = 0x0, 
       buffers = 0x0
     }crash> struct llist_head 0xffff0102ffddb740
struct llist_head {
  first = 0xffff0102ffde1a80
}

或者:
crash> *llist_head 0xffff0102ffddb740
struct llist_head {
  first = 0xffff0102ffde1a80
}
crash> struct llist_head 0xffff0102ffddb740
struct llist_head {
  first = 0xffff0102ffde1a80
}

或者:
crash> *llist_head 0xffff0102ffddb740
struct llist_head {
  first = 0xffff0102ffde1a80
}

查看某个,或某几个cpu的内容:

crash> p call_single_queue:0,1,2
per_cpu(call_single_queue, 0) = $12 = {
  first = 0xffff0102ffde1a80
}
per_cpu(call_single_queue, 1) = $13 = {
  first = 0x0
}
per_cpu(call_single_queue, 2) = $14 = {
  first = 0x0
}

读取percpu变量的内容

有如下结构体和per cpu变量cfd_data:

struct call_function_data {
	call_single_data_t	__percpu *csd;
	cpumask_var_t		cpumask;
	cpumask_var_t		cpumask_ipi;
};

static DEFINE_PER_CPU_ALIGNED(struct call_function_data, cfd_data);

需要读取31号cpu的cfd_data,中的csd中的第0号cpu的内容。

首先需要获取31号cpu的cfd_data的内容:

crash> p cfd_data:31
per_cpu(cfd_data, 31) = $15 = {
  csd = 0xffff80001180fa80,
  cpumask = {{
      bits = {18446744071562067967, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }},
  cpumask_ipi = {{
      bits = {18446744071562067966, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }}
}

在读取csd = 0xffff80001180fa80 变量下第0号cpu具体内容:

crash> struct call_single_data_t 0xffff80001180fa80:0
[0]: ffff0102ffde1a80
struct call_single_data_t {
  node = {
    llist = {
      next = 0xffff00ff8a973a08
    },
    {
      u_flags = 17,
      a_flags = {
        counter = 17
      }
    },
    src = 0,
    dst = 0
  },
  func = 0xffff8000103500d0 <tlb_remove_table_smp_sync>,
  info = 0x0
}

或者:
crash> *call_single_data_t 0xffff80001180fa80:0

crash工具学习 —— percpu相关的一些用法 - 摩斯电码

crash、kdump工具学习 - 摩斯电码

p和struct的区别

p  #SYMBOL变量
默认打变量/符号的内容,如果是结构体也会打印所有结构体的内容,如果是percpu 则打印percpu所有的地址

p #SYMBOL:#N
打印percpu 对应N的内容,如果是a则打印所有的。


struct struct_name[.member[,member]]  [address | symbol][:cpuspec]
 打印结构体struct_name的内容,或者某个,某些成员。 需要提供地址address或者变量符号名symbol。
 如果对应的地址或变量是percpu的,需要提供:cpuspec索引cpu,如果是a则全部。
 
 例如:
 crash> p cfd_data:0
per_cpu(cfd_data, 0) = $6 = {
  csd = 0xffff80001180d100,  //cfd是percpu
  cpumask = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }},
  cpumask_ipi = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }}
}
crash> struct call_single_data_t 0xffff80001180d100    //直接显示percpu将出错,需要提供cpuspec
struct call_single_data_t struct: page excluded: kernel virtual address: ffff80001180d100  type: "gdb_readmem_callback"

crash> struct call_single_data_t 0xffff80001180d100:0
[0]: ffff0102ffddf100
struct call_single_data_t {
  node = {
    llist = {
      next = 0x0
    },
    {
      u_flags = 0,
      a_flags = {
        counter = 0
      }
    },
    src = 0,
    dst = 0
  },
  func = 0x0,
  info = 0x0
}

struct 可以达到部分p的功能。 

struct 可以达到部分p的功能。
如果需要显示对应变量,地址为结构体:
crash> struct call_function_data cfd_data:0
[0]: ffff0102ffddb780
struct call_function_data {
  csd = 0xffff80001180d100,
  cpumask = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }},
  cpumask_ipi = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }}
}

*号命令。可以实现p或struct功能

*号命令。可以实现p或struct功能

crash> *call_function_data cfd_data:0
[0]: ffff0102ffddb780
struct call_function_data {
  csd = 0xffff80001180d100,
  cpumask = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }},
  cpumask_ipi = {{
      bits = {18446744073709551614, 18446744073709551615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    }}
}

标签:crash,struct,percpu,single,call,data,cpu
From: https://blog.51cto.com/u_13451572/11911284

相关文章

  • 查看Windows下引起Oracle CPU占用率高的神器-qslice
    前言:qslice是一个win2000的工具包,能分析进程的cpu占用率,我们用于分析oracle的性能 这是绿色的软件无需安装。 我们经常会碰到oracle的CPU占用居高不下,无法快速定位到问题SQL,就需要这个神器:qslice。分析过程:1、进入qslice,打开oracle进程,双击进入 2、最大化弹出的窗口,发......
  • 【编程底层思考】线程阻塞时一定会释放cpu吗
    线程阻塞时是否释放CPU取决于阻塞的原因和操作系统的行为。以下是一些具体情况:1.阻塞等待资源:当线程因为等待某个资源(如锁、信号量、条件变量等)而阻塞时,它通常会释放CPU,以便其他线程可以运行。在这种情况下,阻塞的线程不会占用CPU资源,直到它等待的资源变得可用。2.阻塞等......
  • CPU核心不同,对服务器性能有哪些影响?
    CPU核心数量对服务器性能有显著影响,尤其在处理多任务和并发工作负载时。以下是不同核心数量对服务器性能的具体影响:1.并行处理能力1)多任务处理:多核心CPU可以同时处理多个任务,因为每个核心都可以独立执行线程。这意味着服务器可以更高效地处理并发请求,减少响应时间。对于......
  • Linux实时查看GPU (NVIDIA),CPU及内存使用情况
    GPU方法一:需要用到一个工具gpustatpipinstallgpustat#安装工具gpustat-cp#输出当前状态gpustat-cp-i1#持续监视方法二:使用nvidia-smi命令nvidia-smi-lsecondsnvidia-smi--loop=seconds上述两个命令都可以,要把seconds换成你想刷新的时间间隔。按......
  • 转载-perf-深入探索 perf CPU Profiling 实现原理
    https://mazhen.tech/p/深入探索-perf-cpu-profiling-实现原理/深入探索perfCPUProfiling实现原理perf是什么perf是由Linux官方提供的系统性能分析工具。我们通常说的perf实际上包含两部分:perf命令,用户空间的应用程序perf_events,Linux内核中的一个子系统内......
  • 【Linux】阿里巴巴开源系统性能监视工具tsar:支持收集和报告系统的各种性能数据,包括CPU
    tsar是一个功能强大且用户友好的系统性能监视工具,广泛应用于开发者和系统管理员中。本文将带你从tsar的基础知识开始,逐步深入到中级和高级用法,帮助你全面掌握tsar的强大功能。......
  • 【RK3588】关于 devfreq 和 cpufreq 的记录
    前言本文主要介绍了/sys/class/devfreq和/sys/devices/system/cpu/cpufreq目录,以及如何手动管理和监控设备频率和CPU频率。同时提供了简单的Python脚本,用于打印设备和CPU的频率信息。环境信息:硬件:FriendlyNanoPi-R6S固件:rk3588-usb-debian-bullseye-minimal-6......
  • 标签贴错,AMD召回所有新一代CPU
    前言 上个月,AMD首席执行官苏姿丰博士在ComputeX开幕主题演讲上揭开了Zen5架构的神秘面纱。作为AMD未来几年CPU的台柱子,Zen5立刻被引入消费级市场,面向笔记本和台式机的产品在几周内相继发布。欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经......
  • 【计算机组成原理】五、中央处理器:1.CPU的功能与结构&指令执行过程(运算器、数据通路、
    五、中央处理器文章目录五、中央处理器1.CPU的功能与结构1.1CPU功能1.2运算器1.2.1基本结构1.2.2ALU和寄存器的数据通路1.3控制器1.3.1基本结构1.3.2控制器功能1.4CPU的基本结构2.指令执行过程2.1指令周期2.2指令周期流程2.3数据流2.4指令执行方案:如何安排多条指令......
  • cpu使用率高
    人们常说,计算密集型程序的CPU密集程度更高。那么,JAVA应用程序中的哪些操作更加CPU密集?以下列出了常见的CPU密集型操作:1、频繁的GC;如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。2、序列化和反序列化。......