亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Linux運(yùn)維常用的命令介紹-開發(fā)調(diào)試命令介紹

今天小編要跟大家分享的文章是關(guān)于Linux運(yùn)維常用的命令介紹-開發(fā)調(diào)試命令介紹。Linux常用命令中有一些命令可以在開發(fā)或調(diào)試過(guò)程中起到很好的幫助作用,有些可以幫助了解或優(yōu)化我們的程序,有些可以幫我們定位疑難問題。本文將簡(jiǎn)單介紹一下這些命令。 Linux入門新手和正在Linux學(xué)習(xí)的小伙伴快來(lái)看一看吧,希望能夠?qū)Υ蠹矣兴鶐椭?!

一、示例程序

我們用一個(gè)小程序,來(lái)幫助后面我們對(duì)這些命令的描述,程序清單cmdTest.c如下:

#include<stdio.h>

int test(int a,int b)

{

return a/b;

}

int main(int argc,char *argv[])

{

int a = 10;

int b = 0;

printf("a=%d,b=%dn",a,b);

test(a,b);

return 0;

}

編譯獲得elf文件cmdTest并運(yùn)行:

gcc -g -o cmdTest cmdTest.c

./cmdTest

a=10,b=0

Floating point exception (core dumped)

程序內(nèi)容是在main函數(shù)中調(diào)用test,計(jì)算a/b的值,其中b的值為0,因此程序由于除0錯(cuò)誤異常終止。

二、查看文件基本信息--file

file cmdTest

cmdTest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=448e1c34b4c548120e2c04f6a2bfce4e6d2281a3, not stripped

通過(guò)file命令可以看到cmdTest的類型為elf,是64位、運(yùn)行于x86-64的程序,not striped表明elf文件中還保留著符號(hào)信息以及調(diào)試信息等不影響程序運(yùn)行的內(nèi)容。

三、查看程序依賴庫(kù)--ldd

ldd cmdTest

Linux-vdso.so.1 => (0x00007ffc8e548000)

libc.so.6 => /lib/x86_64-Linux-gnu/libc.so.6 (0x00007f0621931000)

/lib64/ld-Linux-x86-64.so.2 (0x00007f0621cf6000)

我們可以看到cmdTest依賴了libc.so等庫(kù)。

四、查看函數(shù)或者全局變量是否存在于elf文件中--nm

nm命令用于查看elf文件的符號(hào)信息。文件編譯出來(lái)之后,我們可能不知道新增加的函數(shù)或者全局變量是否已經(jīng)成功編譯進(jìn)去。這時(shí)候,我們可以使用nm命令來(lái)查看。

例如,查看前面所提到的elf文件有沒有test函數(shù),可以用命令:

nm cmdTest|grep test

000000000040052d T test #打印結(jié)果

按照地址順序列出符號(hào)信息:

nm -n cmdTest

w _ITM_deregisterTMCloneTable

w _ITM_registerTMCloneTable

w _Jv_RegisterClasses

w __gmon_start__

U __libc_start_main@@GLIBC_2.2.5

U printf@@GLIBC_2.2.5

00000000004003e0 T _init

0000000000400440 T _start

0000000000400470 t deregister_tm_clones

00000000004004a0 t register_tm_clones

00000000004004e0 t __do_global_dtors_aux

0000000000400500 t frame_dummy

000000000040052d T test

0000000000400540 T main

0000000000400590 T __libc_csu_init

0000000000400600 T __libc_csu_fini

(列出部分內(nèi)容)

可以看到test函數(shù)的開始地址為0x000000000040052d,結(jié)束地址為0x0000000000400540。

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

例如你在代碼中存儲(chǔ)了一個(gè)版本號(hào)信息,那么即使編譯成elf文件后,仍然可以通過(guò)strings搜索其中的字符串甚至可以搜索某個(gè).c文件是否編譯在其中:

strings elfFile| grep "someString"

六、查看文件段大小--size

可以通過(guò)size命令查看各段大?。?/p>

size cmdTest

text data bss dec hex filename

1319 560 8 1887 75f cmdTest

text段:正文段字節(jié)數(shù)大小

data段:包含靜態(tài)變量和已經(jīng)初始化的全局變量的數(shù)據(jù)段字節(jié)數(shù)大小

bss段:存放程序中未初始化的全局變量的字節(jié)數(shù)大小

當(dāng)我們知道各個(gè)段的大小之后,如果有減小程序大小的需求,就可以有針對(duì)性的對(duì)elf文件進(jìn)行優(yōu)化處理。

七、為elf文件”瘦身“--strip

strip用于去掉elf文件中所有的符號(hào)信息:

ls -al cmdTest

-rwxr-xr-x 1 hyb root 9792 Sep 25 20:30 cmdTest #總大小為9792字節(jié)

strip cmdTest

ls -al cmdTest

-rwxr-xr-x 1 hyb root 6248 Sep 25 20:35 cmdTest#strip之后大小為6248字節(jié)

可以看到,“瘦身”之后,大小減少將近三分之一。但是要特別注意的是,“瘦身”之后的elf文件由于沒有了符號(hào)信息,許多調(diào)試命令將無(wú)法正常使用,出現(xiàn)core dump時(shí),問題也較難定位,因此只建議在正式發(fā)布時(shí)對(duì)其進(jìn)行“瘦身”。

八、查看elf文件信息--readelf

readelf用于查看elf文件信息,它可以查看各段信息,符號(hào)信息等,下面的例子是查看elf文件頭信息:

readelf -h cmdTest

Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 #elf文件魔數(shù)字

Class: ELF64 #64位 elf文件

Data: 2's complement, little endian#字節(jié)序?yàn)樾《诵?/p>

Version: 1 (current)

OS/ABI: UNIX - System V #

ABI Version: 0

Type: EXEC (Executable file)#目標(biāo)文件類型

Machine: Advanced Micro Devices X86-64 #目標(biāo)處理器體系

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位可執(zhí)行文件,運(yùn)行在x86-64中,且字節(jié)序?yàn)樾《诵?。另外,我們還注意到它的入口地址是0x400440(_start),而不是400540(main)。也就是說(shuō),我們的程序運(yùn)行并非從main開始。

九、反匯編指定函數(shù)--objdump

objdump用于展示elf文件信息,功能較多,在此不逐一介紹。有時(shí)候我們需要反匯編來(lái)定位一些問題,可以使用命令:

objdump -d cmdTest #反匯編整個(gè)cmdTest程序

但是如果程序較大,那么反匯編時(shí)間將會(huì)變長(zhǎng),而且反匯編文件也會(huì)很大。如果我們已經(jīng)知道了問題在某個(gè)函數(shù),只想反匯編某一個(gè)函數(shù),怎么處理呢?

我們可以利用前面介紹的nm命令獲取到函數(shù)test的地址,然后使用下面的方式反匯編:

objdump -d cmdTest --start-address=0x40052d --stop-address=0x400540 ##反匯編指定地址區(qū)間

十、端口占用情況查看--netstat

我們可能常常會(huì)遇到進(jìn)程第一次啟動(dòng)后,再次啟動(dòng)會(huì)出現(xiàn)端口綁定失敗的問題,我們可以通過(guò)netstat命令查看端口占用情況:

netstat -anp|grep 端口號(hào)

十一、core dump文件生成配置--ulimit -c

有時(shí)候我們的程序core dump了卻沒有生成core文件,很可能是我們?cè)O(shè)置的問題:

ulimit -c #查看core文件配置,如果結(jié)果為0,程序core dump時(shí)將不會(huì)生成core文件

ulimit -c unlimited #不限制core文件生成大小

ulimit -c 10 #設(shè)置最大生成大小為10kb

十二、調(diào)試神器--gdb

gdb是一個(gè)強(qiáng)大的調(diào)試工具,但這里僅介紹兩個(gè)簡(jiǎn)單使用示例。

有時(shí)候程序可能已經(jīng)正在運(yùn)行,但是又不能終止它,這時(shí)候仍然可以使用gdb調(diào)試正在運(yùn)行的進(jìn)程:

gdb processFile PID #processFile為進(jìn)程文件,pid為進(jìn)程id,可通過(guò)ps命令查找到

有時(shí)候程序可能core dump了,但是系統(tǒng)還留給了我們一個(gè)禮物--core文件。

在core文件生成配置完成之后,運(yùn)行cmdTest程序,產(chǎn)生core文件。我們可以用下面的方法通過(guò)core文件定位出錯(cuò)位置:

gdb cmdTest core #processFile為進(jìn)程文件,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:4

4 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后,就可以看到調(diào)用棧了,出錯(cuò)位置在test函數(shù),cmdTest.c的第4行。

十三、定位crash問題--addr2line

有時(shí)候程序崩潰了但不幸沒有生成core文件,是不是就完全沒有辦法了呢?還是cmdTest的例子。運(yùn)行完cmdTest之后,我們通過(guò)dmesg命令可以獲取到以下內(nèi)容

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

該信息記錄了cmdTest運(yùn)行出錯(cuò)的基本原因(divide error)和出錯(cuò)位置(40053b),我們使用addr2line命令獲取出錯(cuò)具體行號(hào):

addr2line -e cmdTest 40053b

/home/hyb/practice/cmdTest.c:4

可以看到addr2line命令將地址(40053b)翻譯成了文件名(cmdTest.c)和行號(hào)(4),確定了出錯(cuò)位置。

總結(jié)

本文對(duì)以上命令僅介紹其經(jīng)典使用,這些命令都還有其他一些有幫助的用法,但由于篇幅有限,不在此介紹,更多使用方法可以通過(guò)man 命令名的方式去了解。

以上就是馬哥教育今天為大家分享的關(guān)于Linux運(yùn)維常用的命令介紹-開發(fā)調(diào)試命令介紹的文章,希望本篇文章能夠?qū)φ趶氖翷inux相關(guān)工作的小伙伴們有所幫助,想要了解更多Linux相關(guān)知識(shí)記得關(guān)注馬哥教育官網(wǎng)。最后祝愿小伙伴們工作順利!

聲明:文章來(lái)源于網(wǎng)絡(luò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!