国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux后臺開發常用調試工具

Linux愛好者 ? 來源:李海彬 ? 作者:李海彬 ? 2020-08-14 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01 總覽

編譯階段

nm 獲取二進制文件包含的符號信息

strings 獲取二進制文件包含的字符串常量

strip 去除二進制文件包含的符號

readelf 顯示目標文件詳細信息

objdump 盡可能反匯編出源代碼

addr2line 根據地址查找代碼行

運行階段

gdb 強大的調試工具

ldd 顯示程序需要使用的動態庫和實際使用的動態庫

strace 跟蹤程序當前的系統調用

ltrace 跟蹤程序當前的庫函數

time 查看程序執行時間、用戶態時間、內核態時間

gprof 顯示用戶態各函數執行時間

valgrind 檢查內存錯誤

mtrace 檢查內存錯誤

其他

proc文件系統

系統日志

02 編譯階段

nm(獲取二進制文件里面包含的符號)

符號:函數、變量

參數:

-C 把C++函數簽名轉為可讀形式

-A 列出符號名的時候同時顯示來自于哪個文件。

-a 列出所有符號(這將會把調試符號也列出來。默認狀態下調試符號不會被列出)

-l 列出符號在源代碼中對應的行號(指定這個參數后,nm將利用調試信息找出文件名以及符號的行號。對于一個已定義符號,將會找出這個符號定義的行號,對于未定義符號,顯示為空)

-n 根據符號的地址來排序(默認是按符號名稱的字母順序排序的)

-u 只列出未定義符號

strings(獲取二進制文件里面的字符串常量)

功能:

獲取二進制文件里面的字符串常量

用途:

比較重要的是檢查KEY泄露

eg:strings | grep '^.{16}$'查找中是否存在一行有16個字符的行,并顯示出來。

選項:

-a 不只是掃描目標文件初始化和裝載段, 而是掃描整個文件。

-f 在顯示字符串之前先顯示文件名。

-n min-len打印至少min-len字符長的字符串.默認的是4。

#strings/lib/tls/libc.so.6|grepGLIBC GLIBC_2.0 GLIBC_2.1 GLIBC_2.1.1 ……

這樣就能看到glibc支持的版本。

strip(去除二進制文件里面包含的符號)

用途:

可執行程序減肥(通常只在已經調試和測試過的生成模塊上,因為不能調試了)

反編譯、反跟蹤

readelf(顯示目標文件詳細信息)

nm 程序可用于列舉符號及其類型和值,但是,要更仔細地研究目標文件中這些命名段的內容,需要使用功能更強大的工具。其中兩種功能強大的工具是objdump和readelf。

readelf工具使用來顯示一個或多個ELF格式文件信息的GNU工具。使用不同的參數可以查看ELF文件不同的的信息。

readelf

-a 顯示所有ELF文件的信息

-h 顯示ELF文件的文件頭

-l 顯示程序頭(program-header)和程序段(segment)和段下面的節

-S 顯示較為詳細的節信息(section)

-s 顯示符號信息,

-n 顯示標識信息(如果有)

-r 顯示重定位信息(如果有)

-u 顯示展開函數信息(如果有)

-d 顯示動態節信息,一般是動態庫的信息

objdump(盡可能反匯編出源代碼)objdump –S

盡可能反匯編出源代碼,尤其當編譯的時候指定了-g參數時,效果比較明顯。

addr2line(根據地址查找代碼行)

當某個進程崩潰時,日志文件(/var/log/messages)中就會給出附加的信息,包括程序終止原因、故障地址,以及包含程序狀態字(PSW)、通用寄存器和訪問寄存器的簡要寄存器轉儲。

eg:Mar 31 1128 l02 kernel: failing address: 0

如果可執行文件包括調試符號(帶-g編譯的),使用addr2line,可以確定哪一行代碼導致了問題。

eg:addr2line –e exe addr

其實gdb也有這個功能,不過addr2line的好處是,很多時候,bug很難重現,我們手上只有一份crash log。這樣就可以利用addr2line找到對應的代碼行,很方便。

注意:

該可執行程序用-g編譯,使之帶調試信息。

如果crash在一個so里面,那addr2line不能直接給出代碼行。

參數:

-a 在顯示函數名或文件行號前顯示地址

-b 指定二進制文件格式

-C 解析C++符號為用戶級的名稱,可指定解析樣式

-e 指定二進制文件

-f 同時顯示函數名稱

-s 僅顯示文件的基本名,而不是完整路徑

-i 展開內聯函數

-j 讀取相對于指定節的偏移而不是絕對地址

-p 每個位置都在一行顯示

03 運行階段

調試程序的常見步驟:

1、確定運行時間主要花在用戶態還是內核態(比較土的一個方法:程序暫時屏蔽daemon()調用,hardcode收到n個請求后exit(0),time一下程序……)。

2、如果是用戶態,則使用gprof進行性能分析。

3、如果是內核態,則使用strace進行性能分析,另外可以使用其他工具(比如ltrace等)輔助。

ldd(顯示程序需要使用的動態庫和實際使用的動態庫)

#ldd/bin/ls linux-gate.so.1=>(0xbfffe000) librt.so.1=>/lib/librt.so.1(0xb7f0a000) libacl.so.1=>/lib/libacl.so.1(0xb7f04000) libc.so.6=>/lib/libc.so.6(0xb7dc3000) libpthread.so.0=>/lib/libpthread.so.0(0xb7dab000) /lib/ld-linux.so.2(0xb7f1d000) libattr.so.1=>/lib/libattr.so.1(0xb7da6000)

第一欄:需要用什么庫;第二欄:實際用哪個庫文件;第三欄:庫文件裝載地址。

如果缺少動態庫,就會沒有第二欄。

strace(跟蹤當前系統調用)

結果默認輸出到2。

-pattach到一個進程

-c 最后統計各個system call的調用情況

-T 打印system call的調用時間

-t/-tt/-ttt 時間格式

-f/-F 跟蹤由fork/vfork調用所產生的子進程

-o,將strace的輸出定向到file中。

如:strace -f -o ~/

-e expr 指定一個表達式,用來控制如何跟蹤,格式如下:

-e open等價于-e trace=open,表示只跟蹤open調用

使用strace –e open ./prg來看程序使用了哪些配置文件或日志文件,很方便。

-e trace=只跟蹤指定的系統調用

例如:-e trace=open,close,rean,write表示只跟蹤這四個系統調用.

-e trace=file只跟蹤有關文件操作的系統調用

-e trace=process只跟蹤有關進程控制的系統調用

-e trace=network跟蹤與網絡有關的所有系統調用

-e strace=signal 跟蹤所有與系統信號有關的系統調用

-e trace=ipc跟蹤所有與進程通訊有關的系統調用

ltrace(跟蹤當前庫函數)

參數和strace很接近

time(查看程序執行時間、用戶態時間、內核態時間)

#timepsaux|grep'hi' 1020218040.00.01888664pts/6S+17:460:00grephi real0m0.009s user0m0.000s sys0m0.004s

注意:

time只跟蹤父進程,所以不能fork

gprof(顯示用戶態各函數執行時間)

gprof原理:

在編譯和鏈接程序的時候(使用 -pg 編譯和鏈接選項),gcc在你應用程序的每個函數中都加入了一個名為mcount(or“_mcount”, or“__mcount”)的函數,也就是說-pg編譯的應用程序里的每一個函數都會調用mcount, 而mcount會在內存中保存一張函數調用圖,并通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。

使用步驟:

1、使用 -pg 編譯和鏈接應用程序

gcc -pg -o exec exec.c

如果需要庫函數調用情況:

gcc -lc_p -gp -o exec exec.c

2、執行應用程序使之生成供gprof 分析的數據gmon.out

3、使用gprof 程序分析應用程序生成的數據

gprof exec gmon.out > profile.txt

注意:

程序必須通過正常途徑退出(exit()、main返回),kill無效。對后臺常駐程序的調試——我的比較土方法是,屏蔽daemon()調用,程序hardcode收到n個請求后exit(0)。

有時不太準。

只管了用戶態時間消耗,沒有管內核態消耗。

gdb core exec(gdb查看core文件) 準備生成core:

啟動程序前,ulimit -c unlimited,設置core文件不限制大小。(相反,ulimit -c 0,可以阻止生成core文件)

默認在可執行程序的路徑,生成的是名字為core的文件,新的core會覆蓋舊的。

設置core文件名字:

/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作為擴展,1為擴展,否則為0。

proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core,可以修改為:

echo "/data/core/core-%e-%p-%t" > core_pattern

以下是參數列表:

%p - insert pid into filename 添加pid

%u - insert current uid into filename 添加當前uid

%g - insert current gid into filename 添加當前gid

%s - insert signal that caused the coredump into the filename 添加導致產生core的信號

%t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間

%h - insert hostname where the coredump happened into filename 添加主機名

%e - insert coredumping executable name into filename 添加命令名

使用gdb查看core:

gdb

opprofile (查看CPU耗在哪)

常用命令

使用oprofile進行cpu使用情況檢測,需要經過初始化、啟動檢測、導出檢測數據、查看檢測結果等步驟,以下為常用的oprofile命令。

初始化

opcontrol --no-vmlinux : 指示oprofile啟動檢測后,不記錄內核模塊、內核代碼相關統計數據

opcontrol --init : 加載oprofile模塊、oprofile驅動程序

檢測控制

opcontrol --start : 指示oprofile啟動檢測

opcontrol --dump : 指示將oprofile檢測到的數據寫入文件

opcontrol --reset : 清空之前檢測的數據記錄

opcontrol -h : 關閉oprofile進程

查看檢測結果

opreport : 以鏡像(image)的角度顯示檢測結果,進程、動態庫、內核模塊屬于鏡像范疇

opreport -l : 以函數的角度顯示檢測結果

opreport -l test : 以函數的角度,針對test進程顯示檢測結果

opannotate -s test : 以代碼的角度,針對test進程顯示檢測結果

opannotate -s /lib64/libc-2.4.so : 以代碼的角度,針對libc-2.4.so庫顯示檢測結果

linux#opreport CPU:Core2,speed2128.07MHz(estimated)CountedCPU_CLK_UNHALTEDevents(Clockcycleswhennothalted)withaunitmaskof0x00(Unhaltedcorecycles)count100000CPU_CLK_UNHAL T.........|samples|%|------------------------3164571987.6453no-vmlinux436111310.3592libend.so76830.1367libpython2.4.so.1.070460.1253op_test

valgrind(檢查內存錯誤)

使用步驟:

1、官網下載并安裝valgrind。

2、-g編譯的程序都可以使用。

官網的示例代碼test.c

#include voidf(void) { int*x=malloc(10*sizeof(int)); x[10]=0;//problem1:heapblockoverrun }//problem2:memoryleak--xnotfreed intmain(void) { f(); return0; }

編譯程序gcc -Wall -g -o test test.c

3、valgrind啟動程序,屏幕輸出結果。

valgrind --tool=memcheck --leak-check=full ./test

注意:

valgrind只能查找堆內存的訪問錯誤,對棧上的對象和靜態對象沒辦法。

valgrind會影響進程性能,據說可能慢20倍,所以在性能要求高的情況下,只能使用mtrace這種輕量級的工具了(但是mtrace只能識別簡單的內存錯誤)。

如果程序生成的core的堆棧是錯亂的,那么基本上是stackoverflow了。這種情況,可以通過在編譯的時候,加上–fstack-protector-all和-D_FORTIFY_SOURCE=2來檢測。Stack-protector-all會在每個函數里加上堆棧保護的代碼,并在堆棧上留上指紋。(記錄下,沒用過)

因為valgrind 查不了棧和靜態對象的內存訪問越界,這類問題,可以通過使用gcc的-fmudflap –lmudflap來檢測。(記錄下,沒用過)

全局變量的類型不一致的問題,現在還找到比較好的方法,這從另一個方面說明全局對象不是個好的設計,這給調試帶來了麻煩。

mtrace(檢查內存錯誤)

mtrace是glibc內提供的工具,原理很簡單,就是把你程序中malloc()和free()的位置全部下來,最后兩輛配對,沒有配對到的就是memory leak。

使用的步驟如下:

1、代碼中添加mtrace()

#include #include intmain(void) { int*p; inti; #ifdefDEBUG setenv("MALLOC_TRACE","./memleak.log",1); mtrace(); #endif p=(int*)malloc(1000); return0; }

這段代碼malloc了一個空間,卻沒有free掉。我們添加9-12行的mtrace調用。

2、編譯gcc -g -DDEBUG -o test1 test1.c

3、執行./test1,在目錄里會發現./memleak.log。

4、使用mtrace memleak.log查看信息。

#mtracetest1memleak.log -0x0804a008Free3wasneveralloc'd0xb7e31cbe -0x0804a100Free4wasneveralloc'd0xb7ec3e3f -0x0804a120Free5wasneveralloc'd0xb7ec3e47 Memorynotfreed: ----------------- AddressSizeCaller 0x0804a4a80x3e8at/home/illidanliu/test1.c:14

可以看到test1.c沒有對應的free()。

04 其他

proc文件系統

內核的窗口。

proc文件系統是一個偽文件系統,它存在內存當中,而不占用外存空間。

用戶和應用程序可以通過proc得到系統的信息,并可以改變內核的某些參數。

proc/目錄結構(部分):

cmdline 內核命令行

cpuinfo 關于Cpu信息

devices 可以用到的設備(塊設備/字符設備)

filesystems 支持的文件系統

interrupts 中斷的使用

ioports I/O端口的使用

kcore 內核核心映像

kmsg 內核消息

meminfo 內存信息

mounts 加載的文件系統

stat 全面統計狀態表

swaps 對換空間的利用情況

version 內核版本

uptime 系統正常運行時間

net 網絡信息

sys 可寫,可以通過它來訪問或修改內核的參數

proc//目錄結構(部分):

cmdline 命令行參數

environ 環境變量值

fd 一個包含所有文件描述符的目錄

mem 進程的內存被利用情況

stat 進程狀態

status Process status in human readable form

cwd 當前工作目錄的鏈接

exe Link to the executable of this process

maps 內存映像

statm 進程內存狀態信息

root 鏈接此進程的root目錄

系統日志

/var/log/下的日志文件:

/var/log/messages 整體系統信息,其中也包含系統啟動期間的日志。此外,mail、cron、daemon、kern和auth等內容也記錄在var/log/messages日志中。

/var/log/auth.log 系統授權信息,包括用戶登錄和使用的權限機制等。

/var/log/boot.log 系統啟動時的日志。

/var/log/daemon.log 各種系統后臺守護進程日志信息。

/var/log/lastlog 記錄所有用戶的最近信息。這不是一個ASCII文件,因此需要用lastlog命令查看內容。

/var/log/user.log 記錄所有等級用戶信息的日志。

/var/log/cron 每當cron進程開始一個工作時,就會將相關信息記錄在這個文件中。

/var/log/wtmp或utmp 登錄信息。

/var/log/faillog 用戶登錄失敗信息。此外,錯誤登錄命令也會記錄在本文件中。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    809

    瀏覽量

    43035
  • Linux
    +關注

    關注

    88

    文章

    11760

    瀏覽量

    219036
  • 調試工具
    +關注

    關注

    1

    文章

    59

    瀏覽量

    12991

原文標題:Linux 后臺開發常用調試工具

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux系統性能調試工具—strace

    今天給大家分享一個linux內核自帶的調試工具,該工具可用于查看和定位系統問題,進程運行過程探索,進行進程監控,對每個系統調用都可以監測,有助于我們優化系統性能。
    的頭像 發表于 01-30 17:03 ?1913次閱讀
    <b class='flag-5'>Linux</b>系統性能<b class='flag-5'>調試工具</b>—strace

    DR1平臺Linux應用開發指南:含GDB調試、Python及MQTT實戰

    本文為創龍科技DR1 系列評估板 Linux 應用開發手冊,系統講解開發環境搭建、GDB 調試、多類型應用案例及 MQTT 通信實現。核心內容包括 LinuxSDK 與
    的頭像 發表于 01-05 16:48 ?4576次閱讀
    DR1平臺<b class='flag-5'>Linux</b>應用<b class='flag-5'>開發</b>指南:含GDB<b class='flag-5'>調試</b>、Python及MQTT實戰

    福晞軟件調試工具介紹之工程添加Debugware IP(1)

    為方便用戶了解和熟悉「福晞軟件」,我們就軟件的調試工具進行詳細的講解和說明,以幫助用戶實現高效地開發調試
    的頭像 發表于 12-15 09:17 ?3529次閱讀
    福晞軟件<b class='flag-5'>調試工具</b>介紹之工程添加Debugware IP(1)

    如何調試和編程CW32F030C8T7?支持哪些調試工具和編程語言?

    了解如何調試和編程CW32F030C8T7是開發過程中的重要環節。它支持哪些調試工具(如JTAG、串口調試等)和編程語言(如C、C++等)?如何設置和使用這些
    發表于 12-05 06:48

    ElfBoard技術貼|如何在【RK3588】ELF 2開發板進行GDB調試

    GDB(GNU Project Debugger)是在Linux環境下功能全面的調試工具。它提供了一系列強大的調試功能,包括設置斷點、單步執行、打印與觀察變量、查看寄存器及堆棧信息等。在Lin
    的頭像 發表于 11-11 13:47 ?5231次閱讀
    ElfBoard技術貼|如何在【RK3588】ELF 2<b class='flag-5'>開發</b>板進行GDB<b class='flag-5'>調試</b>

    SEGGER Ozone調試器支持第三方調試工具

    SEGGER強大的Ozone調試器和性能分析器,長期以來一直深受J-Link和J-Trace用戶的信任,現在可以支持第三方調試工具了。
    的頭像 發表于 09-29 11:45 ?1135次閱讀

    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業開發板—調試工具安裝

    本文圍繞創龍科技研發的瑞芯微 RK3588 工業開發板,詳細闡述三類調試工具的安裝與配置流程。包括適配 CH340、CH341 芯片的 USB 轉串口驅動安裝步驟及故障排查;系統調試工具
    的頭像 發表于 09-16 14:35 ?907次閱讀
    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業<b class='flag-5'>開發</b>板—<b class='flag-5'>調試工具</b>安裝

    【干貨分享】RT-Trace國產調試工具 | 技術集結

    專為嵌入式開發者打造的一款高性能、多功能的調試工具。它集成了實時系統跟蹤、數據監控、GDB遠程調試、Flash程序燒錄、虛擬終端等多種功能于一體,支持通過WebU
    的頭像 發表于 09-16 08:07 ?864次閱讀
    【干貨分享】RT-Trace國產<b class='flag-5'>調試工具</b> | 技術集結

    【直播預告】RT-Trace調試工具V1.1.0版本功能全解析 | 問學直播

    RT-Thread一直致力于為開發者提供更高效的工具和技術支持。RT-Trace調試工具自面世以來持續演進,功能不斷豐富:2025年5月:RT-Trace首次亮相,開創性地實現了基于SWO
    的頭像 發表于 09-05 11:53 ?1207次閱讀
    【直播預告】RT-Trace<b class='flag-5'>調試工具</b>V1.1.0版本功能全解析 | 問學直播

    請問新唐Nu-Link調試工具是否支持8051系列芯片?

    新唐Nu-Link調試工具包括Nu-Link-Me(ICE)、Nu-Link-Pro(ICE)和Nu-Link(ICE),并支持1T 8051芯片,如N76E003、N76E616和N76E885。其他較舊的 8051 系列目前不受支持,需要額外的調試工具
    發表于 08-18 08:20

    【M-K1HSE開發板免費體驗】系統調試工具 SecureCRT 的使用體驗

    115200,其他參數默認不變,最后點擊 Connect 連接成功,如下圖所示。 4.為了保證系統調試工具支持中文顯示,避免出現中文亂碼,請進行如下字符編碼設置。 依次點擊\"Options
    發表于 08-06 18:20

    調試工具:Eclipse調試工具欄與窗口的深入分析

    摘要 :在嵌入式系統開發領域,高效的調試工具鏈對于項目的成功實施具有決定性意義。本文聚焦于 Eclipse 調試工具欄與窗口的功能特性,深入剖析其在嵌入式開發
    的頭像 發表于 07-07 11:32 ?874次閱讀
    <b class='flag-5'>調試工具</b>:Eclipse<b class='flag-5'>調試工具</b>欄與窗口的深入分析

    RT-Trace調試工具正式發布!

    5月20日,RT-Thread官方預售了首款調試工具RT-Trace,獲得了開發者及企業用戶的廣泛關注與支持。RT-Trace調試工具結束預售階段,即日起正式發布!RT-Trace是一款專為
    的頭像 發表于 06-18 12:02 ?1495次閱讀
    RT-Trace<b class='flag-5'>調試工具</b>正式發布!

    重磅預售!RT-Trace調試工具

    嵌入式開發者注意!調試神器RT-Trace即將登陸淘寶!嵌入式開發從業者們:您是否常被調試效率低下、線程分析不清、故障定位困難所困擾?別愁!專為嵌入式
    的頭像 發表于 05-20 18:15 ?1178次閱讀
    重磅預售!RT-Trace<b class='flag-5'>調試工具</b>

    Segger RTT調試工具的使用方法

    上一期已經跟著小編介紹的安裝步驟,相信大家都已經開始使用了Segger Ozone調試工具。那么今天小編繼續趁熱打鐵,給大家介紹另一個Segger推出的調試輔助工具Segger RTT。
    的頭像 發表于 03-28 14:21 ?3510次閱讀
    Segger RTT<b class='flag-5'>調試工具</b>的使用方法