linux常用命令--開發調試篇

前言

Linux常用命令中有一些命令可以在開發或調試過程中起到很好的幫助作用,有些可以幫助了解或優化我們的程序,有些可以幫我們定位疑難問題。本文將簡單介紹一下這些命令。
轉自:https://www.yanbinghu.com/2018/09/26/61877.html

示例程序

我們用一個小程序,來幫助后面我們對這些命令的描述,程序清單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=%d\n",a,b);test(a,b);return 0;
}

編譯獲得elf文件cmdTest并運行:

gcc -g -o cmdTest cmdTest.c
./cmdTest

輸出:

a=10,b=0
Floating point exception (core dumped)

程序內容是在main函數中調用test,計算a/b的值,其中b的值為0,因此程序由于除0錯誤異常終止。

常用開發調試命令

1 查看文件基本信息—file

file cmdTest

輸出:

cmdTest: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=a1bd4a7dd456246a029c0f5dfc763042b8d2c68e, with debug_info, not stripped

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

2 查看程序依賴庫—ldd

ldd cmdTest

輸出:

        linux-vdso.so.1 (0x00007fffa5be0000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3185bf0000)/lib64/ld-linux-x86-64.so.2 (0x00007f31861e3000)

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

3 查看函數或者全局變量是否存在于elf文件中—nm

nm命令用于查看elf文件的符號信息。文件編譯出來之后,我們可能不知道新增加的函數或者全局變量是否已經成功編譯進去。這時候,我們可以使用nm命令來查看。
例如,查看前面所提到的elf文件有沒有test函數,可以用命令:

nm cmdTest | grep test

輸出:

000000000040052d T test  

按照地址順序列出符號信息:

nm -n cmdTest

輸出:

                 w __cxa_finalize@@GLIBC_2.2.5w __gmon_start__w _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTableU __libc_start_main@@GLIBC_2.2.5U printf@@GLIBC_2.2.5
00000000000004f0 T _init
0000000000000540 T _start
0000000000000570 t deregister_tm_clones
00000000000005b0 t register_tm_clones
0000000000000600 t __do_global_dtors_aux
0000000000000640 t frame_dummy
000000000000064a T test
000000000000065d T main
00000000000006b0 T __libc_csu_init
0000000000000720 T __libc_csu_fini
0000000000000724 T _fini
0000000000000730 R _IO_stdin_used
0000000000000740 r __GNU_EH_FRAME_HDR
00000000000008ac r __FRAME_END__
0000000000200db8 t __frame_dummy_init_array_entry
0000000000200db8 t __init_array_start
0000000000200dc0 t __do_global_dtors_aux_fini_array_entry
0000000000200dc0 t __init_array_end
0000000000200dc8 d _DYNAMIC
0000000000200fb8 d _GLOBAL_OFFSET_TABLE_
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000201008 D __dso_handle
0000000000201010 B __bss_start
0000000000201010 b completed.7698
0000000000201010 D _edata
0000000000201010 D __TMC_END__
0000000000201018 B _end

可以看到test函數的開始地址為000000000000064a,結束地址為000000000000065d。

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

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

strings elfFile| grep "someString"

5 查看文件段大小—size

可以通過size命令查看各段大小:

size cmdTest

輸出:

   text    data     bss     dec     hex filename1619     600       8    2227     8b3 cmdTest

text段:正文段字節數大小
data段:包含靜態變量和已經初始化的全局變量的數據段字節數大小
bss段:存放程序中未初始化的全局變量的字節數大小
當我們知道各個段的大小之后,如果有減小程序大小的需求,就可以有針對性的對elf文件進行優化處理。

6 為elf文件”瘦身“—strip

strip用于去掉elf文件中所有的符號信息:

ls -al cmdTest
-rwxr-xr-x 1 hyb root 9792 Sep 25 20:30 cmdTest #總大小為9792字節strip cmdTestls -al cmdTest
-rwxr-xr-x 1 hyb root 6248 Sep 25 20:35 cmdTest#strip之后大小為6248字節

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

7 查看elf文件信息—readelf

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

readelf -h cmdTest

輸出:

ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              DYN (Shared object file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x540Start of program headers:          64 (bytes into file)Start of section headers:          8808 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         9Size of section headers:           64 (bytes)Number of section headers:         34Section header string table index: 33

從elf頭信息中,我們可以知道該elf是64位可執行文件,運行在x86-64中,且字節序為小端序。另外,我們還注意到它的入口地址是0x400440(_start),而不是400540(main)。也就是說,我們的程序運行并非從main開始

8 反匯編指定函數—objdump

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

objdump -d cmdTest #反匯編整個cmdTest程序

但是如果程序較大,那么反匯編時間將會變長,而且反匯編文件也會很大。如果我們已經知道了問題在某個函數,只想反匯編某一個函數,怎么處理呢?
我們可以利用前面介紹的nm命令獲取到函數test的地址,然后使用下面的方式反匯編:

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

9 端口占用情況查看—netstat

我們可能常常會遇到進程第一次啟動后,再次啟動會出現端口綁定失敗的問題,我們可以通過netstat命令查看端口占用情況:

netstat -anp|grep 端口號

10 進程狀態查看—ps&top

ps命令用于顯示當前進程的狀態,類似于 windows 的任務管理器。
top命令實時顯示當前進程狀態,最活躍的進程顯示在最頂部。

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

有時候我們的程序core dump了卻沒有生成core文件,很可能是我們設置的問題:

ulimit -c #查看core文件配置,如果結果為0,程序core dump時將不會生成core文件
ulimit -c unlimited #不限制core文件生成大小
ulimit -c 10 #設置最大生成大小為10kb

12 調試神器—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: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后,就可以看到調用棧了,出錯位置在test函數,cmdTest.c的第4行。

13 定位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命令名的方式去了解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單有趣的c語言小程序,一個有趣的小程序

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓源碼:#include #include #include #include #include HINSTANCE g_hInstance 0;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nSh…

linux下ora 01110,ORA-01003ORA-01110

Oracle 9i數據庫登錄時&#xff0c;提示ORA-01003&ORA-01110&#xff0c;大概意思是數據文件存儲介質損壞。startup nomount,正常&#xff1b;alter database mount,也正常&#xff1b;alter database open,提示如下&#xff1a;alter database open*ERROR 位于第 1 行:ORA…

x11轉發:通過ssh遠程使用GUI程序

x11轉發&#xff1a;通過ssh遠程使用GUI程序 我們常常使用ssh服務遠程操控服務器&#xff0c;大多數操作我們都可以通過命令行命令來實現。 ssh遠程無法查看GUI程序 現在&#xff0c;筆者在x11-test目錄下放入一張圖片test.jpg&#xff0c;并通過opnencv-python寫一個簡單的…

操作系統引導詳細過程

操作系統引導詳細過程 轉自&#xff1a;https://blog.csdn.net/lijie45655/article/details/89366372 就直觀而言&#xff0c;我們所見到計算機啟動的過程是&#xff1a;按下電腦開機鍵&#xff0c;系統在黑色的屏幕下打印出一些英文語句、然后進入進度條狀態&#xff0c;最后…

android 自定義透明 等待 dialog,Android自定義Dialog內部透明、外部遮罩效果

Android自定義Dialog內部透明、外部遮罩效果發布時間&#xff1a;2020-09-09 03:01:41來源&#xff1a;腳本之家閱讀&#xff1a;117作者&#xff1a;zst1303939801本文實例為大家分享了Android自定義Dialog遮罩效果的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下圖…

對比損失的PyTorch實現詳解

對比損失的PyTorch實現詳解 本文以SiT代碼中對比損失的實現為例作介紹。 論文&#xff1a;https://arxiv.org/abs/2104.03602 代碼&#xff1a;https://github.com/Sara-Ahmed/SiT 對比損失簡介 作為一種經典的自監督損失&#xff0c;對比損失就是對一張原圖像做不同的圖像…

android 融云瀏覽大圖,融云 Android sdk kit 頭像昵稱更新機制

先申明筆者的實現方式不是唯一 也不一定是最優化的方案 如果您看到此篇博文 有不同看法 或者 更好的優化 更高的效率 歡迎在評論發表意見 融云官網點我融云頭像機制相關視頻詳解首先跟大家說一下 kit 跟 lib 的頭像機制 kit 是已經包含融云已經給開發者定制好的界面 諸如 會話界…

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 報錯信息 報錯信息&#xff1a; RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates tha…

android訪問重定向地址,如何從android中重定向url加載圖像(示例代碼)

嗨&#xff0c;我正面臨這個問題我從RESTCall獲取了一個URL網址是http://hck.re/kWWxUI但是當我在瀏覽器中檢查時&#xff0c;它會重定向到https://s3-ap-southeast-1.amazonaws.com/he-public-data/afreen2ac5a33.jpg如何將此圖像加載到我的imageView中我已經知道如何將畢加索…

Linux中的awk、sed、grep及正則表達式詳解

Linux中的awk、sed、grep及正則表達式詳解 簡介 awk、sed和grep是Linux中文本操作的三大利器。 其中awk適用于取列&#xff0c;sed適用于取行&#xff0c;grep適用于過濾。 正則表達式 首先我們來介紹一下正則表達式&#xff0c;正則表達式(regular expression)描述了一種…

android聚焦時如何給控件加邊框,edittext設置獲得焦點時的邊框顏色

第一步&#xff1a;為了更好的比較&#xff0c;準備兩個一模一樣的EditText(當Activity啟動時&#xff0c;焦點會在第一個EditText上&#xff0c;如果你不希望這樣只需要寫一個高度和寬帶為0的EditText即可避免&#xff0c;這里就不這么做了)&#xff0c;代碼如下&#xff1a;a…

gcc參數 -i, -L, -l, -include

gcc參數 -i, -L, -l, -include -i&#xff0c;-L&#xff0c;-l&#xff0c;-include -l和-L -l參數就是用來指定程序要鏈接的庫&#xff0c;-l參數緊接著就是庫名&#xff0c;那么庫名跟真正的庫文件名有什么關系呢&#xff1f;就拿數學庫來說&#xff0c;他的庫名是m&…

xargs 命令教程

xargs 命令教程 轉自&#xff1a;http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年8月 8日 xargs是 Unix 系統的一個很有用的命令&#xff0c;但是常常被忽視&#xff0c;很多人不了解它的用法。 本文介紹如…

android strictmode有什么作用,Android 性能優化 之 StrictMode

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;StrictMode概述StrictMode 是用來檢測程序中違例情況的開發者工具。使用StrictMode&#xff0c;系統檢測出主線程違例的情況會做出相應的反應&#xff0c;如日志打…

curl 的用法指南

curl 的用法指南 轉自&#xff1a;http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年9月 5日 簡介 curl 是常用的命令行工具&#xff0c;用來請求 Web 服務器。它的名字就是客戶端&#xff08;client&#xf…

怎么在html顯示已登錄狀態,jQuery Ajax 實現在html頁面實時顯示用戶登錄狀態

當網站是全靜態的html頁面時&#xff0c;而又希望網站會員在登錄之后并在所有頁面頭部顯示登錄狀態&#xff0c;如用戶名等&#xff0c;如果未登錄就是未登錄狀態&#xff0c;下面給大家來分享實現的方法。一、在html靜態頁面中加入div&#xff0c;并指定ID如&#xff1a;二、新…

互斥鎖、條件變量、信號量淺析

互斥鎖、條件變量、信號量淺析 互斥鎖與條件變量 條件變量是為了保證同步 條件變量用在多線程多任務同步的&#xff0c;一個線程完成了某一個動作就通過條件變量告訴別的線程&#xff0c;別的線程再進行某些動作&#xff08;大家都在semtake的時候&#xff0c;就阻塞在哪里&a…

xpwifi熱點設置android,教你在XP電腦中開啟設置WiFi熱點使用的步驟

對于系統中網絡的連接問題是最重要的&#xff0c;那在處理不同的錯誤的情況中&#xff0c;對于無線網絡的設置也就是我們說的WiFi的使用也是會遇到問題的&#xff0c;那在操作的時候對于電腦中是怎么實現設置WiFi熱點的的&#xff0c;對于這個問題今天小編就來跟大家分享一下教…

C/C++ 指針詳解

指針詳解 參考視頻&#xff1a;https://www.bilibili.com/video/BV1bo4y1Z7xf/&#xff0c;感謝Bilibilifengmuzi2003的搬運翻譯及后續勘誤&#xff0c;也感謝已故原作者Harsha Suryanarayana的講解&#xff0c;RIP。 學習完之后&#xff0c;回看找特定的知識點&#xff0c;善…

android雙聯動列表,Android Fragment實現列表和內容聯動

在平板上經常能看到這種的情況&#xff1a;左邊是一個列表&#xff0c;右邊是列表項對應的內容&#xff0c;當點擊某一個列表時&#xff0c;右邊內容區也會隨之改變。下面使用fragment簡單的demo&#xff1a;思路&#xff1a;在mainactivity定義一個回調接口&#xff0c;并在列…