導航:首頁 > 程序命令 > gdb調試core文件命令

gdb調試core文件命令

發布時間:2023-05-30 20:59:56

A. GDB 調試Coremp問題

如果用CMake編譯工程,則使用選項CMAKE_BUILD_TYPE=Debug:

這樣做g++編譯時就會包含選項-g。如果要同時包含-ggdb選項,可以設置變數CMAKE_CXX_FLAGS_DEBUG。

%e - insert coremping executable name into filename 添加導致產生core的命令
%p - insert pid into filename 添加pid(進程id)

運行程序,生成core文件。下面的命令強燃冊制生成core文件:

或者進入gdb後

file從文件exec載入symbol和executable, core從core中載入coremp

如果是調試Core的機器(host)不是生成Core的機器(target),則動態庫可能不在程序指定的位置上。這時需要指定動態庫的位置。

首先用info sharedlibrary,可以查看動態庫的symbol是否載入正確

如果庫在host上的布局與在target上的布局相同,則使用solib-absolute-prefix比較方便。

target上:

host上:

則可以設置solib-search-path為:

solib-absolute-prefix有個更常用的別名sysroot,所以如下的命令是一樣的:

設置solib-search-path可以指定多個路徑,路徑之間用:隔開。

在多線程的環境下,可以用info threads顯示擾段配所有線程,thread指定緩指線程為當前線程。

GDB 常用法
GDB 調試Coremp問題
嵌入式開發中GDB調試Coremp問題
嵌入式開發中GDB串口遠程調試
用backtrace()調試coremp問題
Valgrind memcheck 用法
Address Sanitizer 用法

段錯誤及GDB Coremp調試方法
https://blog.csdn.net/oscarjulia/article/details/74256997

gdb調試多進程與多線程
https://blog.csdn.net/snow_5288/article/details/72982594

B. corejump 怎麼用gdb調試

1: 對於在應用程序中加入參數進行調試的方法: 直接用 gdb app -p1 -p2 這樣進行調試是不行的。 需要像以下這樣使用: #gdb app (gdb) r -p1 -p2 或者在運行run命令前使用set args命令: (gdb) set args p1 p2 可以用show args 命令來查看 2. 加入斷點: break <linenumber> break <funcName> break +offset break -offset (在當前行號的前面或後面的offset行停住。) break filename:linenum 在源文件filename的linenum行處停住。 break filename:function 在源文件filename的function函數的入口處停住。 break ... if ...可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設置 break if i=100,表示當i為100時停住程序。 3. 查看運行時的堆棧: 使用bt命令 4. 列印某個變數的值: print val 5. 單步: n 繼續運行:c step 單步跟蹤,如果有函數調用,他會進入該函數。 next 同樣單步跟蹤,如果有函數調用,他不會進入該函數。很像VC等工具中的step over。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。 set step-mode set step-mode on 打開step-mode模式,於是,在進行單步跟蹤時,程序不會因為沒有debug信息而不停住。這個參數有很利於查看機器碼。 set step-mod off 關閉step-mode模式。 finish 運行程序,直到當前函數完成返回。並列印函數返回時的堆棧地址和返回值及參數值等信息。 until 或 u 當你厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體。 6.在GDB中執行shell命令: 在gdb環境中,你可以執行UNIX的shell的命令,使用gdb的shell命令來完成: eg. shell make 7. 運行環境 可設定程序的運行路徑。 show paths 查看程序的運行路徑。 set environment varname [=value] 設置環境變數。如:set env USER=hchen show environment [varname] 查看環境變數。 8.觀察點(WatchPoint) 觀察點一般來觀察某個表達式(變數也是一種表達式)的值是否有變化了,如果有變化,馬上停住程 序。我們有下面的幾種方法來設置觀察點: watch 為表達式(變數)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。 rwatch 當表達式(變數)expr被讀時,停住程序。 awatch 當表達式(變數)的值被讀或被寫時,停住程序。 info watchpoints 列出當前所設置了的所有觀察點。 9. 維護breakpoint clear 清除所有的已定義的停止點。 clear func 清除所有設置在函數上的停止點。 delete [breakpoints] [range...] 刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的范圍(如:3-7)。其簡寫命令為d。 比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像回收站一樣。 disable [breakpoints] [range...] disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止 點。簡寫命令是dis. enable [breakpoints] [range...] enable所指定的停止點,breakpoints為停止點號。 10、程序變數 查看文件中某變數的值: file::variable function::variable 可以通過這種形式指定你所想查看的變數,是哪個文件中的或是哪個函數中的。例如,查看文件f2.c中的全局變數x的值: gdb) p 'f2.c'::x 查看數組的值 有時候,你需要查看一段連續的內存空間的值。比如數組的一段,或是動態分配的數據的大小。你可以使用GDB的「@」操作符,「@」的左邊是第一個內存的地址的值,「@」的右邊則你你想查看內存的長度。例如,你的程序中有這樣的語句: int *array = (int *) malloc (len * sizeof (int)); 於是,在GDB調試過程中,你可以以如下命令顯示出這個動態數組的取值: p *array@len 如果是靜態數組的話,可以直接用print數組名,就可以顯示數組中所有數據的內容了。 11.輸出格式 一般來說,GDB會根據變數的類型輸出變數的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個整數的十六進制,或是二進制來查看這個整型變數的中的位的情況。要做到這樣,你可以使用GDB的數據顯示格式: x 按十六進制格式顯示變數。 d 按十進制格式顯示變數。 u 按十六進制格式顯示無符號整型。 o 按八進制格式顯示變數。 t 按二進制格式顯示變數。 a 按十六進制格式顯示變數。 c 按字元格式顯示變數。 f 按浮點數格式顯示變數。 (gdb) p i $21 = 101 (gdb) p/a i $22 = 0x65 (gdb) p/c i $23 = 101 'e' (gdb) p/f i $24 = 1.41531145e-43 (gdb) p/x i $25 = 0x65 (gdb) p/t i $26 = 1100101 11.查看內存 使用examine命令(簡寫是x)來查看內存地址中的值。x命令的語法如下所示: x/ n、f、u是可選的參數。 n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。 f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。 u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。 n/f/u三個參數可以一起使用。例如: 命令:x/3uh 0x54320 表示,從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。 12.自動顯示 你可以設置一些自動顯示的變數,當程序停住時,或是在你單步跟蹤時,這些變數會自動顯示。相關的GDB命令是display。 display display/ display/ expr expr是一個表達式,fmt表示顯示的格式,addr表示內存地址,當你用display設定好了一個或多個表達式後,只要你的程序被停下來,GDB會自動顯示你所設置的這些表達式的值。 格式i和s同樣被display支持,一個非常有用的命令是: display/i $pc undisplay delete display 刪除自動顯示,dnums意為所設置好了的自動顯式的編號。 disable display enable display disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。 info display 查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。 13. 設置顯示選項 set print address set print address on 打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。系統默認為打開的, show print address 查看當前地址顯示選項是否打開。 set print array set print array on 打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。這個選項默認是關閉的。與之相關的兩個命令如下,我就不再多說了。 set print array off show print array set print elements 這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。 show print elements 查看print elements的選項信息。 set print null-stop 如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。 set print pretty on 如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。 14.關於顯示源碼list

C. 怎樣用GDB調試core文件

一般這種情況都是因為數組越界訪問,空指針或是野指針讀寫造成的。程序小的話還比較好辦,對著源代碼仔細檢查就能解決。但是對於代碼量較大的程序,里邊包含N多函數調用,N多數組指針訪問,這時想定位問題就不是很容易了(此時牛人依然可以通過在適當位置打printf加二分查找的方式迅速定位:P)。懶人的顫晌含話還是直接GDB搞起吧。 神馬是Core Dump文件偶爾就能聽見某程序員同學抱怨「擦,又出Core了!」。簡單來說,core mp說的是操作系統執行的一個動作,當某個進程因為一些原因意外終止(crash)的時候,操作系統會將這個進程當時的內存信息轉儲(mp)到磁碟上1。產生的文件就是core文件了,一般會以core.xxx形式命名。 如何產生Core Dump 發生doremp一般都是在進程收到某個信號的時候,linux上謹中現在大概有60多個信號,可以使用 kill -l 命令全部列出來。sagi@sagi-laptop:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX針對特定的信號,應用程序可以寫對應的信號處理函數。如果不指定,則採取默認的處理方式, 默認處理是coremp的信號如下:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT 我們看到SIGSEGV在其中,一般數組越界或是訪問空指針都會產生這個信號。另外雖然默認是這樣的,但是你也可以寫自己的信號處理函數改變默認行為,更多信號相關可以看參考茄笑鏈接33。 上述內容只是產生coremp的必要條件,而非充分條件。要產生core文件還依賴於程序運行的shell,可以通過ulimit -a命令查看,輸出內容大致如下:sagi@sagi-laptop:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 看到第一行了吧,core file size,這個值用來限制產生的core文件大小,超過這個值就不會保存了。我這里輸出是0,也就是不會保存core文件,即使產生了,也保存不下來==! 要改變這個設置,可以使用ulimit -c unlimited。 OK, 現在萬事具備,只缺一個能產生Core的程序了,介個對C程序員來說太容易了。#include ; #include ; int crash() { char *xxx = "crash!!"; xxx[1] = 'D'; // 寫只讀存儲區! return 2; } int foo() { return crash(); } int main() { return foo(); } 上手調試 上邊的程序編譯的時候有一點需要注意,需要帶上參數-g, 這樣生成的可執行程序中會帶上足夠的調試信息。編譯運行之後你就應該能看見期待已久的「Segment Fault(core mped)」或是「段錯誤 (核心已轉儲)」之類的字眼了。看看當前目錄下是不是有個core或是core.xxx的文件。祭出linux下經典的調試器GDB,首先帶著core文件載入程序:gdb exefile core,這里需要注意的這個core文件必須是exefile產生的,否則符號表會對不上。載入之後大概是這個樣子的:sagi@sagi-laptop:~$ gdb coremp core Core was generated by ./coremp'. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in crash () at coremp.c:8 8 xxx[1] = 'D'; (gdb)我們看到已經能直接定位到出core的地方了,在第8行寫了一個只讀的內存區域導致觸發Segment Fault信號。在載入core的時候有個小技巧,如果你事先不知道這個core文件是由哪個程序產生的,你可以先隨便找個代替一下,比如/usr/bin/w就是不錯的選擇。比如我們採用這種方法載入上邊產生的core,gdb會有類似的輸出:sagi@sagi-laptop:~$ gdb /usr/bin/w core Core was generated by ./coremp'. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in ? () (gdb)可以看到GDB已經提示你了,這個core是由哪個程序產生的。 GDB 常用操作 上邊的程序比較簡單,不需要另外的操作就能直接找到問題所在。現實卻不是這樣的,常常需要進行單步跟蹤,設置斷點之類的操作才能順利定位問題。下邊列出了GDB一些常用的操作。 啟動程序:run
設置斷點:b 行號|函數名
刪除斷點:delete 斷點編號
禁用斷點:disable 斷點編號
啟用斷點:enable 斷點編號
單步跟蹤:next 也可以簡寫 n
單步跟蹤:step 也可以簡寫 s
列印變數:print 變數名字
設置變數:set var=value
查看變數類型:ptype var
順序執行到結束:cont
順序執行到某一行: util lineno列印堆棧信息:bt

閱讀全文

與gdb調試core文件命令相關的資料

熱點內容
程序員試用期匯報問題協助怎麼寫 瀏覽:127
抖音演算法到底是什麼 瀏覽:126
哪個vlan技術對報文加密 瀏覽:570
單片機定時電路 瀏覽:672
山西平台伺服器雲主機 瀏覽:700
按摩肚臍解壓視頻 瀏覽:989
php55安裝教程 瀏覽:137
雲伺服器怎麼查找本機域名 瀏覽:22
qd123y壓縮機參數 瀏覽:385
程序員媽媽懷孕 瀏覽:490
金普國際編程 瀏覽:537
java什麼是引用類型 瀏覽:944
這是命令嗎txt 瀏覽:314
支付寶android包名 瀏覽:154
eclipsemaven命令 瀏覽:68
24路伺服器配什麼cpu 瀏覽:466
壓縮文件和解壓文件哪個快 瀏覽:675
亞馬遜雲伺服器視頻通話 瀏覽:912
金融知識app哪個好 瀏覽:978
農行理財app收益在哪裡 瀏覽:969