GDB調試命令小結

来源:http://www.cnblogs.com/cchust/archive/2016/08/06/5744273.html
-Advertisement-
Play Games

1.啟動調試 前置條件:編譯生成執行碼時帶上 -g,如果使用Makefile,通過給CFLAGS指定-g選項,否則調試時沒有符號信息。gdb program //最常用的用gdb啟動程式,開始調試的方式gdb program core //用gdb查看core dump文件,跟蹤程式core的原因g ...


1.啟動調試

前置條件:編譯生成執行碼時帶上 -g,如果使用Makefile,通過給CFLAGS指定-g選項,否則調試時沒有符號信息。
gdb program //最常用的用gdb啟動程式,開始調試的方式
gdb program core //用gdb查看core dump文件,跟蹤程式core的原因
gdb program pid //用gdb調試已經開始運行的程式,指定pid即可
gdb attach pid //用gdb調試已經開始運行的程式,指定pid即可

2.調試命令
(1)執行命令模式
-batch選項。
比如:列印$pid進程所有線程的堆棧並退出。
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

(2).交互模式
run         //運行程式
continue  //中斷後繼續運行到下一個斷點
step        //單步執行,進入函數
next       //單步執行
return    //函數未執行完,忽略未執行的語句,返回。
finish     //函數執行完畢返回。
call        //調用某一個函數 fun("1234")
(backtrace)bt //顯示棧楨
bt N              //顯示開頭N個棧楨
bt -N            //顯示最後N個棧楨
(frame)f N     //顯示第N層棧楨
list //顯示源碼
set directory  //設置gdb的工作目錄
pwd              //當前的工作目錄

(3)反覆執行
continue N    //連續執行cointiue N次,一般用於避免頻繁斷點
step N
next N

3.斷點
break 函數名        //設置斷在某個函數
break 文件名:行號 //設置斷在某一行
info break            //查看設置的斷點信息
break if condition //條件斷點
break 函數名 thread 線程號 //設置斷點只斷某個線程,通過info threads 查看線程號
delete 斷點號 斷點號... //刪除一個或多個斷點
diable 斷點號 斷點號... //禁止一個或多個斷點
enable 斷點號 斷點號... //打開一個或多個斷點
command 斷點號 //斷點觸發時,執行命令,一般用於列印變數
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>print x
>end
(gdb)

4.檢測點
watch //為表達式(變數)expr設置一個觀察點。一量表達式值有變化時,馬上停住程式。
rwatch //當表達式(變數)expr被讀時,停住程式。
awatch //當表達式(變數)的值被讀或被寫時,停住程式。
info watchpoints //列出當前所設置了的所有觀察點。

經驗:觀察某個變數是否變化,被讀或者被寫,由於變數只在某一個作用域,可以獲取變數的地址,然後觀察。
比如:觀察examined_rows變數神馬時候被修改
(1).p &examined_rows,得到地址
(2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個變數的變化情況。

5.查看變數
(1)設置
set print elements N //指定列印的長度,對長字元串特別有用。
set print element 0 //輸出完整的字元串
set print pretty //設置GDB列印結構的時候,每行一個成員,並且有相應的縮進,預設是關閉的
print {type} variable
比如:
(gdb) p {ABC} 0x7fffffffe710
$2 = {val = 1.5, val2 = 10}

print xxx //列印變數
p /x xxx //16進位顯示
p str@str_len //列印字元串

info locals //列印出當前函數中所有局部變數及其值。
info args //列印出當前函數的參數名及其值。
display 變數 //自動列印變數
undisplay //取消自動列印
註意:預設編譯的時候,調試過程是看不見巨集的值的,編譯時候需要給選項。-g3

6.記憶體查看
格式: x /nfu <addr> x 是 examine 的縮寫
a.n表示要顯示的記憶體單元的個數
b.f表示顯示方式, 可取如下值
(1).x 按十六進位格式顯示變數。
(2).d 按十進位格式顯示變數。
(3).u 按十進位格式顯示無符號整型。
(4).o 按八進位格式顯示變數。
(5).t 按二進位格式顯示變數。
(6).a 按十六進位格式顯示變數。
(7).i 指令地址格式
(8).c 按字元格式顯示變數。
(9).f 按浮點數格式顯示變數。
c.u表示一個地址單元的長度
(1).b表示單位元組,
(2).h表示雙位元組,
(3).w表示四位元組,
(4).g表示八位元組

比如:x/3xh buf
表示從記憶體地址buf讀取內容,3表示三個單位,x表示按十六進位顯示,h表示以雙位元組為一個單位。

7.多線程調試
info threads //查看線程
thread thread_no //切換到線程號
thread apply all command //所有線程都執行命令列印棧楨
比如:thread apply all bt //所有線程都列印棧楨

(1)線程鎖
show scheduler-locking
set scheduler-locking on
set scheduler-locking off
預設是off,當程式繼續運行的時候如果有斷點,那麼就把所有的線程都停下來,直到你指定某個線程繼續執行(thread thread_no apply continue).
但是如果直接在當前線程執行continue的話,預設是會啟動所有線程。這種模式有一種副作用,如果多個線程都斷在同一個函數,這時候調試會出問題。
這個時候需要打開線程鎖,但打開線程鎖,意味著其它線程不能運行了。

(2)non-stop模式(7.0以後的版本支持)
set target-async 1
set pagination off
set non-stop on
gdb啟動了不停模式,除了斷點有關的線程會被停下來,其他線程會執行。

8.信號量
(1).singal 發送信號
假定你的程式已將一個專用的 SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程式設置成採取某個清理動作,
要想測試該信號處理程式,你可以設置一個斷點並使用如下命令:
(gdb) signal 2
(2).handle 攔截信號
Handle命令可控制信號的處理,他有兩個參數,一個是信號名,另一個是接受到信號時該作什麼。幾種可能的參數是:
* nostop 接收到信號時,不要將它發送給程式,也不要停止程式。
* stop 接受到信號時停止程式的執行,從而允許程式調試;顯示一條表示已接受到信號的消息(禁止使用消息除外)
* print 接受到信號時顯示一條消息
* noprint 接受到信號時不要顯示消息(而且隱含著不停止程式運行)
* pass 將信號發送給程式,從而允許你的程式去處理它、停止運行或採取別的動作。
* nopass 停止程式運行,但不要將信號發送給程式。
比如:
handle SIGPIPE stop print //截獲SIGPIPE信號,程式停止並列印信息
handle SIGUSR1 nostop noprint //忽略SIGUSR1信號

9.生成環境使用GDB場景
內核轉儲(coredump)
(1).配置產生core文件
前置條件:確保系統配置的core file size足夠,一般設置成unlimited
ulimit -c unlimited

配置corefile的參數:
echo 2 > /proc/sys/fs/suid_dumpable [程式中切換用戶,也要產生corefile]
mkdir /tmp/corefiles
chmod 777 /tmp/corefiles
echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產生的目錄為/tmp/corefiles
echo "1" > /proc/sys/kernel/core_uses_pid

註意:
a.確保配置的目錄有足夠的磁碟空間,否則產生core文件可能不完整。
b.對於mysqld而言,要保證正確產生core-file,需要加上--core-file,預設這個參數是不打開的。
c.kill -9 pid 是不能產生core文件的,因為SIGKILL信號不能被捕獲。

(2).使用core文件
gdb /usr/mysql/bin/mysqld core.24556

(3).dump已經運行進程的狀態信息
gdb attach pid
(gdb) generate-core-file
調試完畢後,通過detach命令退出。
另外,通過gcore pid 命令也可以dump core文件,生成在當前目錄下。

(4).列印線程信息
pstack pid
pt-pmp -p pid
pstack和pt-pmp都可以列印線程的信息,但是pt-pmp會對同類堆棧的線程做聚合彙總,相對於pstack功能更強大,顯示也更友好。

(5).altert日誌
這裡主要針對mysqld問題排查,mysqld異常crash後,有時候在alter日誌中可以看到最後crash線程的堆棧,但是一般只有函數名或一串二進位地址,無法定位到具體是crash到哪一行,通過addr2line可以解這個問題。
比如:alter日誌中記錄crash時的地址是0x64bd60,通過如下命令,可以定位到具體是哪一行
addr2line -e /usr/mysql/bin/mysqld 0x64bd60
/home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

參考文檔
https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵和大家分享一個比較經典的場景,資料庫的面試題目,主要的表是學生、課程、成績、教師四張表,本示例的特點是有模擬數據,加深理解和印象,答案主要基於Oracle來實現的 1、四張表分別為: 2、題目要求 3、在資料庫建表 /* */ /* CREATE TABLE */ /* */ --學生表 CRE ...
  • 目標 理解線上部署考慮的因素 學會編譯安裝以及二進位安裝mysql 學會升級mysql 學會多實例部署mysql資料庫 學會合理部署mysql線上庫 考慮因素: 版本選擇,5.1,5.5還是5.6? 分支選擇,官方社區版?percona server?mariadb? 推薦官方版,簡單易上手 安裝方 ...
  • 口令文件介紹 在ORALCE資料庫系統中,用戶如果要以特權用戶身份(SYS/SYSDBA/SYSOPER)登錄ORALCE資料庫可以有兩種身份驗證的方法:即使用與操作系統集成的身份驗證或使用ORALCE資料庫的密碼文件進行身份驗證。因此,管理好密碼文件,對於控制授權用戶從伺服器本機或遠端登錄Orac... ...
  • CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; ...
  • [sql] EXP-00091: 正在導出有問題的統計信息。www.2cto.com . . 正在導出表 WF_GENERAL導出了 EXP-00091: 正在導出有問題的統計信息。 . . 正在導出表 WF_PLAN_BOOK導出了 EXP-00091: 正在導出有問題的統計信息。 . . 正在導 ...
  • 這篇博客是上一篇博客Oracle shutdown immediate遭遇ORA-24324 ORA-24323 ORA-01089的延伸(資料庫掛起hang時,才去重啟的),其實這是我們海外一工廠的遇到的案例,把內容拆開是因為這個case分開講述顯得主題明確一些。正式進入主題: 伺服器資料庫版本O... ...
  • ORACLE 10g下載地址 oracle 下載還需要用戶名我自己註冊了個方便大家使用下載 user:[email protected]:qwe123QWE現在直接點擊不能下載了 要經過oracle許可才可以下載 如果嫌麻煩可以用迅雷直接下載密碼是這個 一般不會動了 大家也不用幫我找回密碼了 ...
  • 關於Ubuntu運行級別、開機啟動腳本的說明 目錄簡介 1.1介紹Ubuntu下麵的自啟動腳本目錄 1.2 Linux操作系統運行級別的概念 1.3關於操作系統自啟腳本的啟動順序 1.4 Linux操作系統運行級別的概念 1.5 自啟和關閉自啟服務 1.6 對於init [number]命令 Con ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...