LINUX实用命令

命令列表

dmesg

dmesg是一种程序,用于检测和控制内核环缓冲。程序用来帮助用户了解系统的启动信息。
Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。

主要应用

dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。在系统引导时,内核将与硬件和模块初始化相关的信息填到这个缓冲区中。内核环缓冲区中的消息对于诊断系统问题 通常非常有用。在运行dmesg时,它显示大量信息。通常通过less或grep使用管道查看dmesg的输出,这样可以更容易找到待查信息。例如,如果发现硬盘性能低下,可以使用dmesg来检查它们是否运行在DMA模式:

$dmesg | grep DMA

ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:DMA, hdd:DMA

上面几行可以说明每个IDE设备正在什么模式下运行。如果以太网连接出现问题,那么可以在dmesg日志中搜索eth:

$dmesg | grep eth
forcedeth.c: Reverse Engineered nForce
ethernet driver. Version 0.49.
eth0: forcedeth.c: subsystem: 0147b:1c00
bound to 0000:00:04.0
eth0: no IPv6 routers present

如果一切正常,那么dmesg显示每个网卡的硬件配置信息。如果某项系统服务未能得到正确的配置,dmesg日志很快就填满错误消息,这是诊断故障的良好起点。

还可以用来探测系统内核模块的加载情况,比如要检测ACPI的加载情况,使用dmesg | grep acpi

dmesg |egrep -i ‘’(apm|acpi)’’

Kernel command line: vga=274 quiet console=ttyS3,9600acpi=no-idleoot=/dev/hda3

ACPI: Core Subsystem version [20010208]

ACPI: Subsystem enabled

ACPI: System firmware supports: C2

ACPI: plvl2lat=99 plvl3lat=1001

ACPI: C2 enter=1417 C2 exit=354

ACPI: C3 enter=-1 C3 exit=-1

ACPI: Not using ACPI idle

ACPI: System firmware supports: S0 S1 S4 S5

语法

dmesg [ -c ] [ -n 级别 ] [ -s 缓冲区大小 ]

  • c
    当完成打印显示后清除环缓冲内的内容。
  • s 缓冲区大小
    定义一个大小为"缓冲区大小"的缓冲区用于查询内核环缓冲区。默认大小为 8196(此大小与 2.0.33 和 2.1.103 内核的默认syslog 缓冲区大小一致),如果你设置了一个大于默认值的环缓冲区,那你就可以用这个选项定义一个相当的缓冲区来查看完整的环缓冲区内容。
    -n级别
    设置级别为记录控制台启动信息的级别。比如,-n 1指的就是将此级别设为最低级,除了内核恐慌信息之外不会向控制台显示信息。所有级别的启动信息还将记录到/proc/kmsg,文件中,因此,syslogd(8)同样可以用来对信息的输出进行控制。当使用-n选项时,dmesg将不会 清除内核环缓冲区中的内容。当同时使用以上两个选项时,只有最后一个选项才会产生效果。

使用示例

  • 浏览dmesg输出的信息 dmesg | less
  • 查看dmesg尾部的信息 dmesg | tail
  • 打印并清除内核环形缓冲区 dmesg -c
  • 将开机信息发邮件 dmesg >boot.messages
  • 以当前时间的方式显示时间信息 dmesg -T
  • 显示dmesg中两条打印信息的时间间隔 dmesg -d

addr2line

addr2line工具是一个可以将指令的地址和可执行映像转换为文件名、函数名和源代码行数的工具。这在内核执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。

用法

addr2line [-a| --addresses ] [-b bfdname | --target=bfdname] [-C | --demangle[=style]] [-e filename | --exe=filename] [-f | --function] [-s | --basename] [-i | --inlines] [-p | --pretty-print] [-j | --section=name] [-H | --help] [-V | --version] [addr addr …]

参数

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=:指定目标文件的格式为bfdname。
-e --exe=:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。

用法

查找系统信息,然后定位代码

dmesg

[52544662.870318] exchange[10379]: segfault at 7ff94d672138 ip 00007ffa45ab0a59 sp 00007ff9dcd50818 error 6 in libc-2.19.so[7ffa45a16000+1be000]

这条信息里,ip(指令指针寄存器)字段后面的数字就是exchange程序出错时程序执行的位置。使用addr2line就可以将00007ffa45ab0a59 定位到代码的位置:
addr2line 00007ffa45ab0a59 -e test -f -s -C

原理

addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息(所以编译的时候需要加-g选项),其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。Line Number Table存储在可执行程序的.debug_line域。
使用如下命令
readelf -w test | grep “advance Address”

[0x000000ca] Special opcode 7: advance Address by 0 to 0x4005e7 and Line by 2 to 3
[0x000000cb] Special opcode 146: advance Address by 10 to 0x4005f1 and Line by 1 to 4
[0x000000cc] Special opcode 104: advance Address by 7 to 0x4005f8 and Line by 1 to 5
[0x000000cd] Special opcode 36: advance Address by 2 to 0x4005fa and Line by 3 to 8
[0x000000ce] Special opcode 118: advance Address by 8 to 0x400602 and Line by 1 to 9
[0x000000cf] Special opcode 146: advance Address by 10 to 0x40060c and Line by 1 to 10
[0x000000d0] Special opcode 104: advance Address by 7 to 0x400613 and Line by 1 to 11
[0x000000d1] Special opcode 104: advance Address by 7 to 0x40061a and Line by 1 to 12
[0x000000d3] Special opcode 20: advance Address by 1 to 0x40062c and Line by 1 to 13
[0x000000d5] Special opcode 132: advance Address by 9 to 0x400646 and Line by 1 to 14
[0x000000d6] Special opcode 76: advance Address by 5 to 0x40064b and Line by 1 to 15
观察第二行和第三行,源代码的第4行的指令起始地址是0x4005f1, 第5行的起始地址是0x4005f8,可以知道0x4005f5位置的指令是属于第4行代码的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值