首页 > 编程知识 正文

linux调试命令(shell常用命令)

时间:2023-05-03 18:27:22 阅读:77577 作者:2088

前言

Linux上的一些常见命令在开发和调试过程中很有用,一些命令有助于理解和优化程序,而其他命令则有助于确定问题。 本文简要介绍这些命令。

示例程序

为了帮助您介绍这些命令,请使用小程序。 程序列表cmdTest.c为以下:

#includestdio.hinttest(inta,int b ) { return a/b; }intmain(intargc,char *argv[] ) { int a=10; int b=0; printf(a=%d,b=%dn ),a,b ); test(a,b ); 返回0; 编译并运行elf文件cmdTest :

gcc-g-ocmdtestcmdtest.c./cmdtesta=10,b=0floatingpointexception (core dumped ) )程序的内容是在main函数中调用test,然后a/b 在此,b值为

查看文件基本信息--file

filecmdtestcmdtest : elf 64-bitlsbexecutable,x86-64,版本1 (sysv ), 动态链接) usessharedlibs build id [ sha1 ]=448 e 1c 34 B4 c 548120 e 2c 04 F6 a2 bfc E4 E6 d 2281 a 3,not stripped通过文件命令显示cmdTest的Tata

查看程序依赖库--ldd

lddcmdtestlinux-vdso.so.1=(0x 00007 ffc8e 548000 ) libc.so.6=/lib/x86 _ 65374; 64-Linux-GNU/libc.so

查看函数或者全局变量是否存在于elf文件中--nm

nm命令显示elf文件的符号信息。 编译文件后,可能不知道新添加的函数或全局变量是否成功编译。 此时,可以使用nm命令进行显示。 例如,要确定上述elf文件中是否存在test函数,请使用命令。

nm cmdtest|grep test 000000000040052按打印结果地址顺序列出符号信息:

nm-ncmdtestw _ ITM _ deregistertmclonetablew _ ITM _ registertmclonetablew _ JV _ registerclassesw _ gmon _ start f @ 00440 t _ start 000000000000470 TD eregister _ TM _ clones 000000000000 04e0t _ do _ global _ dtors _ au x 000000000000000000000400 在000000000000400540 tmain 0000000000000000 600 t _ _ libc _ CSU _ fini (列表的一部分)中,test函数的开始地址为0x 0000000000000040052 d,然后退出

打印elf文件中的可打印字符串--strings

例如,如果将版本号信息存储在代码中,则即使在编译到elf文件后,也可以在strings中搜索字符串或搜索. c文件是否已编译。

在stringselffile|grep ' somestring '

查看文件段大小--size

中,可以使用size命令显示段大小。

sizecmdtesttextdatabssdechexfilename 13195608188775 fcmdtesttext段:包含正文段的字节数大小data段:静态变量和初始化的全局变量的数据段

为elf文件”瘦身“--strip

strip用于从elf文件中删除所有符号信息。

ls-al cmdtest-rwxr-xr-x1 hyb root 9792 sep 2520

:30 cmdTest #总大小为9792字节strip cmdTestls -al cmdTest-rwxr-xr-x 1 hyb root 6248 Sep 25 20:35 cmdTest#strip之后大小为6248字节

可以看到,“瘦身”之后,大小减少将近三分之一。但是要特别注意的是,“瘦身”之后的elf文件由于没有了符号信息,许多调试命令将无法正常使用,出现core dump时,问题也较难定位,因此只建议在正式发布时对其进行“瘦身”。

查看elf文件信息--readelf

readelf用于查看elf文件信息,它可以查看各段信息,符号信息等,下面的例子是查看elf文件头信息:

readelf -h cmdTest Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 #elf文件魔数字 Class: ELF64 #64位 elf文件 Data: 2's complement, little endian#字节序为小端序 Version: 1 (current) OS/ABI: UNIX - System V # ABI Version: 0 Type: EXEC (Executable file)#目标文件类型 Machine: Advanced Micro Devices X86-64 #目标处理器体系 Version: 0x1 Entry point address: 0x400440 #入口地址 Start of program headers: 64 (bytes into file) Start of section headers: 4456 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 28 Section header string table index: 27

从elf头信息中,我们可以知道该elf是64位可执行文件,运行在x86-64中,且字节序为小端序。另外,我们还注意到它的入口地址是0x400440(_start),而不是400540(main)。也就是说,我们的程序运行并非从main开始。

反汇编指定函数--objdump

objdump用于展示elf文件信息,功能较多,在此不逐一介绍。有时候我们需要反汇编来定位一些问题,可以使用命令:

objdump -d cmdTest #反汇编整个cmdTest程序

但是如果程序较大,那么反汇编时间将会变长,而且反汇编文件也会很大。如果我们已经知道了问题在某个函数,只想反汇编某一个函数,怎么处理呢?我们可以利用前面介绍的nm命令获取到函数test的地址,然后使用下面的方式反汇编:

objdump -d cmdTest --start-address=0x40052d --stop-address=0x400540 ##反汇编指定地址区间

端口占用情况查看--netstat

我们可能常常会遇到进程第一次启动后,再次启动会出现端口绑定失败的问题,我们可以通过netstat命令查看端口占用情况:

netstat -anp|grep 端口号

进程状态查看--ps&top

ps命令的用法可以参考

ps命令常见实用用法

。top命令实时显示当前进程状态,最活跃的进程显示在最顶部。

core dump文件生成配置--ulimit -c

有时候我们的程序core dump了却没有生成core文件,很可能是我们设置的问题:

ulimit -c #查看core文件配置,如果结果为0,程序core dump时将不会生成core文件ulimit -c unlimited #不限制core文件生成大小ulimit -c 10 #设置最大生成大小为10kb

调试神器--gdb

gdb是一个强大的调试工具,但这里仅介绍两个简单使用示例。有时候程序可能已经正在运行,但是又不能终止它,这时候仍然可以使用gdb调试正在运行的进程:

gdb processFile PID #processFile为进程文件,pid为进程id,可通过ps命令查找到

有时候程序可能core dump了,但是系统还留给了我们一个礼物--core文件。在core文件生成配置完成之后,运行cmdTest程序,产生core文件。我们可以用下面的方法通过core文件定位出错位置:

gdb cmdTest core #processFile为进程文件,core为生成的core文件Core was generated by `./cmdTest'.Program terminated with signal SIGFPE, Arithmetic exception.#0 0x00000000004004fb in test (a=10, b=0) at cmdTest.c:44 return a/b;(gdb)bt#0 0x00000000004004fb in test (a=10, b=0) at cmdTest.c:4#1 0x000000000040052c in main (argc=1, argv=0x7ffca9536d38) at cmdTest.c:10(gdb)

输入bt后,就可以看到调用栈了,出错位置在test函数,cmdTest.c的第4行。

定位crash问题--addr2line

有时候程序崩溃了但不幸没有生成core文件,是不是就完全没有办法了呢?还是cmdTest的例子。运行完cmdTest之后,我们通过dmesg命令可以获取到以下内容

[27153070.538380] traps: cmdTest[2836] trap divide error ip:40053b sp:7ffc230d9280 error:0 in cmdTest[400000+1000]

该信息记录了cmdTest运行出错的基本原因(divide error)和出错位置(40053b),我们使用addr2line命令获取出错具体行号:

addr2line -e cmdTest 40053b/home/hyb/practice/cmdTest.c:4

可以看到addr2line命令将地址(40053b)翻译成了文件名(cmdTest.c)和行号(4),确定了出错位置。

总结

本文对以上命令仅介绍其经典使用,这些命令都还有其他一些有帮助的用法,但由于篇幅有限,不在此介绍,更多使用方法可以通过man 命令名的方式去了解。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。