gdb常用的除錯方法

2021-07-07 10:32:49 字數 3176 閱讀 4056

1. 安裝gdb

yum install gdb

2. 列印執行緒的堆疊

1,ps -afx   //檢視程序id

2,attach 正在執行的程序

gdb debugme pid

3,set logging file /tmp/test.txt   //設定操作gdb的日誌輸出檔案

set logging on  //開啟日誌輸出

gdb attach到 httpd後的例子:

(gdb) set logging file /tmp/test.txt

(gdb) set logging on

copying output to /tmp/test.txt.

thread 2 (thread 0x41ec5940 (lwp 7312)):

#0 0x00002b6370d241c0 in pthread_cond_timedwait@@glibc_2.3.2 () from /lib64/libpthread.so.0

#1 0x00002aaab3bbf229 in ?? () from /usr/lib64/libnspr4.so

#2 0x00002aaab3bbfe69 in pr_waitcondvar () from /usr/lib64/libnspr4.so

#3 0x00002aaab3bc51bc in pr_sleep () from /usr/lib64/libnspr4.so

#4 0x00002aaab302750e in ?? () from /usr/lib64/libssl3.so

#5 0x00002aaab3bc55cd in ?? () from /usr/lib64/libnspr4.so

#6 0x00002b6370d1f77d in start_thread (arg=) at pthread_create.c:301

#7 0x00002b637120d9ad in clone () from /lib64/libc.so.6

thread 1 (thread 0x2b63731b4360 (lwp 4718)):

#0 0x00002b6371206b42 in select () from /lib64/libc.so.6

#1 0x00002b6370b10d25 in apr_sleep () from /usr/lib64/libapr-1.so.0

#2 0x00002b636f242315 in ap_wait_or_timeout ()

#3 0x00002b636f24b79e in ap_mpm_run ()

#4 0x00002b636f225fd8 in main ()

現在可以在/tmp/test.txt自由檢視堆疊資訊了

3,根據dump裡的位址,檢視對應的**函式

info symbol 0x12ffeedd

list 0x11ffeedd

4,非互動模式 下,列印core檔案 堆疊

-q: 不列印gdb的版權訊息

--batch: 執行批處理,不進入互動模式

--ex: 執行gdb 命令

"set height 0": 不對輸出進行分頁

pmap,來輸出程序記憶體的狀況,可以用來分析執行緒堆疊

gdb 裡這個命令就叫dump,這裡僅給出一種簡單的用法,其他的可以在gdb裡 help。

dump binary memory file start_addr end_addr

前面就寫dump binary memory,後面接檔名,接著是起始位址,然後是尾位址。dump出來的資料怎麼用就隨君了。

什麼是core dump?

core的意思是記憶體, dump的意思是扔出來, 堆出來.開發和使用unix程式時, 有時程式莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程序號的檔案生成執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在乙個core檔案中, 叫core dump.這個檔案便是作業系統把程式down掉時的記憶體內容扔出來生成的, 它可以做為除錯程式的參考.

core dump又叫核心轉儲, 當程式沒有core檔案生成怎麼辦呢?

有時候程式down了, 但是core檔案卻沒有生成,core檔案的生成跟你當前系統的環境設定有關係, 可以用下面的語句設定一下, 然後再執行程式便會生成core檔案.

ulimit -c unlimited

core檔案生成的位置一般於執行程式的路徑相同, 檔名一般為core.程序號,在我的ubuntu12.04lts下生產的檔名為core。

介紹了core dump之後,來看看如何在多執行緒除錯中使用core dump。

使用 kill 命令產生 core dump檔案:

kill -11 pid

這不還是殺掉程序嘛?沒錯,但是你用訊號11殺掉它,會讓程序產生乙個 segmentation fault,從而(如果你沒禁用 core dump 的話),導致乙個 core dump。隨後你得到乙個 core 檔案,裡面包含了死鎖的時候,程序的記憶體映象,也就包括了正在糾結纏綿,生離死別從而產生死鎖的那兩個,沒準是幾個,執行緒們的,棧。

現在知道該怎麼辦了吧?用 gdb 開啟這個 core 檔案,然後

編譯**

$> g++ -wall -std=c++11 dead_lock_demo.cpp -o dead_lock_demo -g -pthread

執行程式,發現程式列印出「about to dead_lock」 就不動了,現在我們使用gdb來除錯。注意gdb的版本要高於7.0,之前使用過gdb6.3除錯多執行緒是不行的。

在這之前需要先產生core dump檔案:

$> ps -aux | grep dead_lock_demo

找出 dead_lock_demo 執行緒號,然後:

$> kill -11 pid

此時會生成core dump 檔案,在我的系統上名字就是 core

然後除錯:

$> gdb dead_lock_demo core

多執行緒死鎖除錯技巧:

refs:

下面這個連線有其它的debug技巧,比如如何debug x error,

gstack 指令碼原始碼:

GDB除錯方法

一 多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令 二 除錯巨集 這個問題超多。在gdb下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要gcc的配合。在gcc編譯程式的時候,加上 ggdb3引數,這樣,你就可以除錯巨集了。另外,你可以...

常用的gdb除錯命令

一.gdb常用命令 命令 描述backtrace 或bt 檢視各級函式呼叫及引數 finish 連續執行到當前函式返回為止,然後停下來等待命令 frame 或f 幀編號 選擇棧幀 info 或i locals 檢視當前棧幀區域性變數的值 list 或l 列出源 接著上次的位置往下列,每次列10行 l...

gdb除錯常用的指令

關於第一次使用了gcc後,我做了一些總結 以乙個題目為例 對於兩組使用者輸入的字串進行比較,長度自定,輸出相同的字元。下面是一些gdb常用的指令 首先是要進入gdb除錯環境,先通過gcc g o newname name.c 生成可執行檔案 gdb newname進入gdb除錯環境 退出gdb ob...