crash 工具使用

2023-11-17

1. rd 命令

用法:

  • 读取内核虚地址或者内核符号值,默认16进制显示,类型为unsigned long,并且会将值对应的ascii码显示出来
    • rd <内核地址> 或 rd <内核符号>
    • 如果不需要将右边的ascii码显示出来,可以使用rd -x
    • 如果只显示ascii码的话,使用rd -a
  • 读取 物理内存地址的值
    •  rd -p 物理内存地址
  • 以10进制有符号数显示

    • rd -d

  • 以10进制无符号数显示

    • rd -D

  • 读取指定数量的内存,单位默认为unsigned long

    • rd <地址> <数量>

  • 指定数据宽度,默认是unsigned long,但是还可以指定别的,读取的数量的单位也会随之调整

        8 位宽:rd -8

        16位宽:rd -16

        32位宽:rd -32

        64位宽:rd -64

  • 将内存中的数据转换为可以识别的内存符号、函数指针、slab对象、文件指针等。
    • rd -s
    • 如果想得到详细的转换,那么可以用rd -S或者rd -SS
  • 将读到的区域dump到一个文件
    • rd -r <file>
  • 设置结束地址,如果不设置长度,那么一直读到设置的结束地址
    • rd -e <地址或符号>
  • 从指定偏移处开始读区,这个偏移是基于传入地址
    • rd -o <字节偏移>
crash> bt 50486
PID: 50486  TASK: ffff881171480c80  CPU: 18  COMMAND: "ps"
 #0 [ffff8810d1d9bce0] schedule at ffffffff815f353d
 #1 [ffff8810d1d9bd40] rwsem_down_read_failed at ffffffff815f61ea
 #2 [ffff8810d1d9bd98] call_rwsem_down_read_failed at ffffffff813271d4
 #3 [ffff8810d1d9bde0] down_read at ffffffff815f58b3
 #4 [ffff8810d1d9bde8] proc_pid_cmdline_read at ffffffff8126c5e8
 #5 [ffff8810d1d9be70] __vfs_read at ffffffff81202fd6
 #6 [ffff8810d1d9bee8] vfs_read at ffffffff8120360a
 #7 [ffff8810d1d9bf18] sys_read at ffffffff81204382


crash> rd  ffff8810d1d9bd98 -e ffff8810d1d9bde0
ffff8810d1d9bd98:  ffffffff813271d4 ffff880000000000   .q2.............
ffff8810d1d9bda8:  0000000000024200 ffff88203f0226f0   .B.......&.? ...
ffff8810d1d9bdb8:  00000000004037ae 0000000000000078   .7@.....x.......
ffff8810d1d9bdc8:  0000000000000000 0000000000000020   ........ .......
ffff8810d1d9bdd8:  ffff88203c8fc0a8

2. set 命令

set  命令行应用广泛,可以指定进程的上下文。如果不指定,就显示kernel panic 时正在运行的进程。

crash> set
    PID: 208789
COMMAND: "CPU 8/KVM"
   TASK: ffff8803472a90d0  [THREAD_INFO: ffff88031e614000]
    CPU: 54
  STATE: TASK_RUNNING (PANIC)

通过 -c 可以指定cpu,以显示cpu上运行的进程,-p 选项可以显示kernel panic时运行的进程。      

crash>  set -c 3
    PID: 59023
COMMAND: "CPU 35/KVM"
   TASK: ffff880262d990d0  [THREAD_INFO: ffff882f4cbc8000]
    CPU: 3
  STATE: TASK_INTERRUPTIBLE (ACTIVE)

crash> set -p
    PID: 208789
COMMAND: "CPU 8/KVM"
   TASK: ffff8803472a90d0  [THREAD_INFO: ffff88031e614000]
    CPU: 54
  STATE: TASK_RUNNING (PANIC)

有时crash 会输出大量信息。下述命令可以禁止滚动

crash> set scroll off
scroll: off (/usr/bin/less)
也可以用以下命令
crash> sf
scroll: off (/usr/bin/less)
crash> 

sf是别名,是set scroll off 的简写,默认别名可以使用alias查看。

crash> alias
ORIGIN   ALIAS    COMMAND
builtin  man      help 
builtin  ?        help 
builtin  quit     q 
builtin  sf       set scroll off 
builtin  sn       set scroll on 
builtin  hex      set radix 16 
builtin  dec      set radix 10 
builtin  g        gdb 
builtin  px       p -x 
builtin  pd       p -d 
builtin  for      foreach 
builtin  size     * 
builtin  dmesg    log 
builtin  lsmod    mod 
builtin  last     ps -l 

 3. h 命令

h 命令可以显示输入过的命令

crash> h
[1] set
[2] set scroll off
[3] sf
[4] alias
crash> 

4. bt 命令

bt 命令可以输出进程的backtrace,下面命令可以显示所有进程的backtrace。

crash> foreach bt -tf

-t 选项表示显示栈中所有的文本符号(text symbol)

说明:函数在被定义为inline,因此在转储的backtrace不会显示call 对应的函数

crash> bt 3
PID: 3      TASK: ffff880167380000  CPU: 0   COMMAND: "ksoftirqd/0"
 #0 [ffff88016738be20] __schedule at ffffffff816c201b
 #1 [ffff88016738be88] schedule at ffffffff816c25d9
 #2 [ffff88016738be98] smpboot_thread_fn at ffffffff810bef72
 #3 [ffff88016738bec8] kthread at ffffffff810b65f1
 #4 [ffff88016738bf50] ret_from_fork at ffffffff816ce0f7
 
 crash> bt -t 3
PID: 3      TASK: ffff880167380000  CPU: 0   COMMAND: "ksoftirqd/0"
              START: __schedule at ffffffff816c201b
  [ffff88016738be88] schedule at ffffffff816c25d9
  [ffff88016738be98] smpboot_thread_fn at ffffffff810bef72
  [ffff88016738beb8] smpboot_thread_fn at ffffffff810bee90
  [ffff88016738bec8] kthread at ffffffff810b65f1
  [ffff88016738bf30] kthread at ffffffff810b6520
  [ffff88016738bf50] ret_from_fork at ffffffff816ce0f7
  [ffff88016738bf80] kthread at ffffffff810b6520

-f 选项能显示栈帧内所有栈数据,该选项可以方便的查看函数参数

-l 显示文件名和行号

crash> bt -l 3
PID: 3      TASK: ffff880167380000  CPU: 0   COMMAND: "ksoftirqd/0"
 #0 [ffff88016738be20] __schedule at ffffffff816c201b
    /data/rpmbuild/kernel3/5648486/BUILD/kernel-3.10.0/kernel-3.10.0/kernel/sched/core.c: 2562
 #1 [ffff88016738be88] schedule at ffffffff816c25d9
    /data/rpmbuild/kernel3/5648486/BUILD/kernel-3.10.0/kernel-3.10.0/kernel/sched/core.c: 3656
 #2 [ffff88016738be98] smpboot_thread_fn at ffffffff810bef72
    /data/rpmbuild/kernel3/5648486/BUILD/kernel-3.10.0/kernel-3.10.0/kernel/smpboot.c: 158
 #3 [ffff88016738bec8] kthread at ffffffff810b65f1
    /data/rpmbuild/kernel3/5648486/BUILD/kernel-3.10.0/kernel-3.10.0/kernel/kthread.c: 202
 #4 [ffff88016738bf50] ret_from_fork at ffffffff816ce0f7
    /data/rpmbuild/kernel3/5648486/BUILD/kernel-3.10.0/kernel-3.10.0/arch/x86/kernel/entry_64.S: 370

-a 选项只显示当前进程,但是在运行的系统中无法显示当前进程。

4. dev命令

dev命令可以显示字符设备列表,

-p 选项显示pci 数据,其内容与lspci 基本相同。

-i 选项可以显示IO端口和IO设备与内存映射,与下面命令基本相同

cat /proc/ioports
cat /proc/iomem
crash> dev -p
    ROOT BUS     BUSNAME
ffff8830a5a97400 0000:00
      PCI DEV      DO:BU:SL.FN  CLASS   PCI_ID      TYPE   
  ffff8830a6245000 0000:00:00.0  0600  8086:2020 ROOT_PORT 
  ffff8830a6243000 0000:00:04.0  0880  8086:2021   RC_END  
  ffff8830a6242000 0000:00:04.1  0880  8086:2021   RC_END  
  ffff8830a6241000 0000:00:04.2  0880  8086:2021   RC_END  
  ffff885f7edb8000 0000:00:04.3  0880  8086:2021   RC_END 

crash> dev -i
    RESOURCE        RANGE    NAME
ffffffff81a5bc80  0000-ffff  PCI IO
ffff88303ff71140  0000-03af  PCI Bus 0000:00
ffffffff81a40b20  0000-001f  dma1
ffffffff81a40b58  0020-0021  pic1

5. dis 命令

dis命令可以输出反汇编

6. struct 命令

struct 命令可以显示结构的定义,并结合显示实际地址中的数据。

crash> struct timespec xtime_update
struct timespec {
  tv_sec = -8554494033697431793, 
  tv_nsec = -4051189094619261979
}

-o可以显示结构体的偏移量

crash> struct -o transaction_s
struct transaction_s {
    [0] journal_t *t_journal;
    [8] tid_t t_tid;
   [12] enum {T_RUNNING, T_LOCKED, T_FLUSH, T_COMMIT, T_COMMIT_DFLUSH, T_COMMIT_JFLUSH, T_COMMIT_CALLBACK, T_FINISHED} t_state;
   [16] unsigned long t_log_start;
   [24] int t_nr_buffers;
   [32] struct journal_head *t_reserved_list;
   [40] struct journal_head *t_buffers;
   [48] struct journal_head *t_forget;
   [56] struct journal_head *t_checkpoint_list;
   [64] struct journal_head *t_checkpoint_io_list;
   [72] struct journal_head *t_shadow_list;
   [80] struct list_head t_inode_list;
   [96] spinlock_t t_handle_lock;
  [104] unsigned long t_max_wait;
  [112] unsigned long t_start;
  [120] unsigned long t_requested;
  [128] struct transaction_chp_stats_s t_chp_stats;
  [152] atomic_t t_updates;
  [156] atomic_t t_outstanding_credits;
  [160] transaction_t *t_cpnext;
  [168] transaction_t *t_cpprev;
  [176] unsigned long t_expires;
  [184] ktime_t t_start_time;
  [192] atomic_t t_handle_count;
  [196] unsigned int t_synchronous_commit : 1;
  [200] int t_need_data_flush;
  [208] struct list_head t_private_list;
}
SIZE: 224

二、Crash的使用举例

用法1:查看数据成员的偏移,递归成员可以把偏移相加就行,也能侧得倒

crash> struct -o kvm_ioapic  # 就可以看到数据结构内成员偏移

# 有了link的地址,怎么得到struct kvm_kernel_irq_routing_entry地址?那就要看该link在该数据结构中的偏移了。可以看到**偏移是48**
struct kvm_kernel_irq_routing_entry {
	[48] struct hlist_node link;  # 这里的48是10进制,要翻译成16进制才是偏移量
}

# 计算出该地址减去48后的地址量,注意是-48,而不是0x48。所以这里也可以直接减去0x30
p -x 0xffff88839fdfd3f0-48

# 也可以直接转换成16进制
crash> p -x 48
$1 = 0x30

用法2:怎么从栈中找传入的参数

起因:查看栈:发现spdk 的这个线程卡在sock_sendmsg上,所有要去排查到底是哪个socket。

        unix_wait_for_peer(struct sock *other, long timeo)参数中有struct sock,从栈中查找参数地址,就能顺藤摸瓜struct socket。

内核栈的布局简单说明

        栈内布局如下面,返回地址是上一帧的末尾,pre_rbp是这一帧的开头,后面是反汇编看到压入的寄存器,再后面是sub $0x30, %rsp留出的局部变量空间。注意,栈是从高地址往低地址去填入数据。注意:在x86-64 平台上,参数传递时如果子函数的参数不超过6个,那么直接使用寄存器传值,如果子函数的参数超过6个,那么从第七个参数开始,从后往前依次压入栈中。具体传第1、2、3、4、5参的寄存器分别是%rdi,%rsi,%rdx,%rcx,%rax。

 用bt -f 命令查看一个具体示例:每个函数被调用,第一行指令就是push %rbp,注意点这个%rbp不是自己这个被调用者的栈顶地址,而是调用者的栈顶地址。这样当从被调用者return调用者时,只要pop %rbp就能回到调用者的栈顶。那么当被调用者去调用其他函数时,会先push %rip,然后执行call 指令。执行了call 指令就是进入了下一层栈帧了。由此可知,一个函数的栈帧数据,是以上一次调用者的栈顶地址%rbp为栈顶,以call 指令的下一行指令地址即返回地址%rip为栈底。


 

 怎么从栈中找到参数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

crash 工具使用 的相关文章

  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • vue使用高德地图导航路线失败,获取驾车数据失败:INVALID_USER_SCODE(解决方法)

    高德地图使用路线导航 最近做大屏项目 里面有地图定位 路线导航等方面的功能 在做路线定位是一直都是获取不到导航的路线 经过好长时间的百度看高德api文档终于找到解决方法 解决方法 添加高德地图安全密钥 添加高德安全密钥 安全密钥是和key一
  • 计算机毕业设计-基于SSM的网上书店管理系统

    项目背景 本网上系统是针对目前网上的实际需求 从实际工作出发 对过去的网上系统存在的问题进行分析 结合计算机系统的结构 概念 模型 原理 方法 在计算机各种优势的情况下 采用目前最流行的B S结构和java中流行的ssm框架和eclipse
  • jq ajax fail,javascript - jQuery.ajax fail handler not called - Stack Overflow

    Deprecation Notice The jqXHR success jqXHR error and jqXHR complete callbacks are removed as of jQuery 3 0 You can use j
  • 【Linux】-关于调试器gdb的介绍和使用

    作者 小树苗渴望变成参天大树 作者宣言 认真写好每一篇博客 作者gitee gitee 如 果 你 喜 欢 作 者 的 文 章 就 给 作 者 点 点 关 注 吧 文章目录 前言 一 Linux中的debug和release 二 gdb的使
  • Java作用域

    try catch里面的是局部变量 java变量的作用域分为四个级别 类级 对象实例级 方法级 块级 块级变量就是定义在一个块 内部的变量都是局部变量 try 中try后面的 就是一个块级作用域 所以内部定义的变量是局部变量 在Java中
  • Android自定义导览地图组件(一)

    丨版权说明 Android自定义导览地图组件 一 于当前CSDN博客和乘月网属同一原创 转载请说明出处 谢谢 鉴于Android关于自定义导览地图的相关资料以及开源项目贫乏 应Android同行几位小伙伴们的建议 决定写下这篇文章分享给大家
  • 团队管理的一些总结

    这将近三年 我在公司经历了很多事情 在学习中成长 很多时候我都在总结每个步骤和过程我取得的成绩和失败 如果说我们需要一个有效性高的团队 需要一个能够创造奇迹的团队 那么我觉得如下这些就是我经历了这么多得到的启示 1 必须明确目标 当然这个目
  • CANopen基本概念学习笔记

    参考文献 Kinco FD CD3系列伺服驱动器使用手册20210125 CANopen协议讲解课件 信捷 CANopen 通讯用户手册 基于CANopen协议的网络主控制器的设计 前置文章 CAN总线技术基本概念简述 0 CANopen简
  • 【分布式ID】理解Snowflake算法的实现原理

    1 概述 转载 冷饭新炒 理解Snowflake算法的实现原理 我上次也看了一个视频讲解 分布式ID 键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2 前提 Snowflake 雪花 是Twitter开源的高性能ID生成算
  • idea 的使用与快捷键

    前面写过一篇IDEA的入门级文章 但是只学会了那些配置啊什么的并不能提高我们的开发效率 事实上 如果你IDEA用的足够熟练 就可以把鼠标扔了 附入门级教程传送门 http blog csdn net qq 31655965 article
  • 使用两个栈(stack)实现一个队列(queue)

    题目 已知下面Stack类及其3个方法Push Pop和Count 请用2个Stack实现Queue类的入队 Enqueue 出队 Dequeue 方法 class Stack public void Push int x Push an
  • C# Revit二次开发基础/核心编程--- 元素Element(基础、编辑)

    一 本节课程 C Revit二次开发基础 核心编程 元素Element 基础 编辑 二 本节要讲解的知识点 元素Element的基础概念 如何编辑元素 具体内容 元素Element基础 元素在Revit里面尤其重要 用户能看见的大多数对象都
  • gsoap工具生成wsdl接口 注意事项

    wsdl是通过wsdl文件作为不同应用的通信接口 所以如何生成wsdl语言很重要 但是很多时候我们发现自己编写的头文件通过gsoap工具soapcpp2 exe从头文件中无法正常生成对应的wsdl语言 几经寻找 终于发现 通过对应头文件 h
  • 使GDAL库支持中文路径或中文文件名的处理方法

    之前生成的gdal 2 1 1动态库 在通过命令行执行时 遇到有中文路径或中文图像名时 GDALOpen函数不能正确的被调用 如下图 解决方法 1 在所有使用GDALAllRegister 语句后面加上一句CPLSetConfigOptio
  • 万万没想到,曾经以为的 VSCode 专属代码工具,竟然可以这样…

    如果你知道 VSCode 一说起它 你可能第一个想到的就是把它当做一个代码编辑器 而它的界面应该可能大概率是这样的 如果你恰好又是个程序员 那你可能经常会用到它 不管是 Python JS 还是 C 等各种语言对应的文件 都可以用它来进行简
  • Java中使用MultipartFile 接受图片或者文件超过2MB就会出现异常MultipartFile类型不能接受

    解决方法 在配置文件中写入这个配置 然后就可以根据业务在进行限制了
  • 混淆保护需正确命名!看.NET Core代码保护工具.NET Reactor如何规定

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • 大端对齐 和小端对齐

    大端对齐 高内存地址放整数高位 低内存地址放整数低位 例如x86 arm都是采用大端对齐 小端对其 高内存地址放整数低位 低内存地址放整数高位 例如unix大型服务器 转载于 https www cnblogs com Json28 p 1
  • Linux内核文件系统知识大总结

    1 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • crash 工具使用

    1 rd 命令 用法 读取内核虚地址或者内核符号值 默认16进制显示 类型为unsigned long 并且会将值对应的ascii码显示出来 rd lt 内核地址 gt 或 rd lt 内核符号 gt 如果不需要将右边的ascii码显示出来