gdb基礎命令和常用操作補充
讓程式按照自己定義的要求執行,不必每次改變程式 讓程式在設定的斷點處停住,並且檢查程式的執行情況 動態改變程式的執行環境一、啟動除錯 gdb <program> 啟動程式進行除錯
gdb ./bin/chat_server
gdb --args ./bin/chat_server -c conf/cache_server.conf
在 UNIX 下用 ps 檢視正在執行的程式的 PID (程序 ID), 然後用 gdb <program> PID 格式
gdb ./bin/chat_server $(pgrep chat_server)
gdb <program> core 除錯程式core down時候產生的core檔案
gdb ./bin/chat_server core 可以先使用 gcore pid (tgid,主執行緒id)產生正在執行程式的 core 檔案,然後進行除錯。
Attach到後臺程序,將操作預先輸入好,避免影響程式正常執行
sudo gdb ./bin/chat_server `pgrep chat_server` <<END
b HandleAccept
c
p (char *)inet_ntoa(pstSctx->stClientAddr.sin_addr)
p ntohs(pstSctx->stClientAddr.sin_port)
quit
END
三、gdb常用操作補充 1. ulimit -c unlimited; 除錯core檔案 bt/where/info s 顯示函式呼叫堆疊 up n 向呼叫鏈根部移動n個函式 down n 向呼叫鏈葉部移動n個函式 f n 選擇函式呼叫鏈上編號為n的函式,0表示當前函式 info files 顯示core檔案裡面的segment對映
如果core檔案函式呼叫棧亂掉,可以參照 http://devpit.org/wiki/x86ManualBacktrace 恢復堆疊。 2. 設定觀察點 watch <expr> expr 值變化時,停止程式 rwatch <expr> expr 值被讀時,停止程式 awatch <expr> expr 值被讀或被寫時,停止程式 info watchpoints 檢視當前觀察點資訊 3.反彙編
disassemble可以反彙編當前函式或者指定的函式,單獨用disassemble命令是反彙編當前函式,如果disassemble命令後面跟函式名或地址則反彙編指定的函式。 4.前面講過step命令可以一行程式碼一行程式碼地單步除錯,而這裡用到的si/ni命令可以一條指令一條指令地單步除錯。 info registers可以顯示所有暫存器的當前值。在gdb中表示暫存器名時前面要加個$,例如p $esp可以列印esp暫存器的值,如esp暫存器的值是0xbff1c3f4,所以x/20 $esp命令檢視記憶體中從0xbff1c3f4地址開始的20個32位數。
5. p 命令記憶體輸出格式:
• d: ⼗十進位制
• u: ⼗十進位制⽆無符號
• x: ⼗十六進位制
• o: ⼋八進位制
• t: ⼆二進位制
• c: 字元 如 p/x var 6. set listsize 50 修改原始碼顯示行數; 此外還有set args 設定引數;set var 設定變數值 7.設定位置斷點,設定斷點命令b (break的簡寫)
b linenum
b function
b filename:linenum
b filename:function
b *address
b if <condition>
8. 檢視當前執行資訊
info b <breakpoints> breakpoints 為設定的斷點的標號
info args/frame/locals/line filename:function
info line 配合disassemble使用可檢視程式彙編程式碼 其中info frame 顯示的當前堆疊資訊比frame詳細,可以先用frame num 切換堆疊,where/info s/bt 可以檢視堆疊呼叫鏈 9. 條件式中斷 b test if a == 10 類似 condition 4 a == 30 (4 是bk num) 10. 刪除斷點可以使用 clear和d(delete的簡寫) clear刪除斷點, 使用方法和b命令類似 d [breakpoints] breakpoints 為設定的斷點的標號 10. 啟動和檢視程式 setargs 設定程式執行引數 run執行程式,使用方式如:r <args> List 顯示程式原始碼命令,使用show listsize 檢視顯示程式碼的行數
list <function/linenum/filename:function/filename:linenum/-/+> ,-向上翻動,+向下翻動
p var/expression(filename::var/function::var),列印變數值
11. 恢復執行程式和單步除錯程式 continue,繼續執行程式 next <count> 單步跟蹤,遇到函式不進入函式 step <count> 單步跟蹤,遇到函式會進入該函式 finish 直到函式執行完成,列印函式資訊 until 在迴圈體內跟蹤程式,直到整個迴圈結束 until+行號: 執行至某行,不僅僅用來跳出迴圈12. x 命令可以顯示指定地址的記憶體資料。
格式: x/nfu [address]
• n: 顯示記憶體單位 (組或者行)。
• f: 格式 (除了print 格式外,還有字串s 和 彙編i)。
• u: 記憶體單位 (b: 1位元組; h: 2位元組; w: 4位元組; g: 8位元組)。 x/8w 0x0804843b # 按四位元組(w)顯示 8組記憶體資料
x/8i 0x0804843b # 顯示8 行彙編指令
13. 程序與執行緒 info proc mappings # 相當於 cat /proc/{pid}/maps 檢視maps記憶體資料
可以在 pthread_create 處設定斷點,當執行緒建立時會生成提示資訊。[New Thread 0xb7e78b70 (LWP 2933)]
info threads # 檢視所有執行緒列表
where # 顯示當前執行緒呼叫堆疊
thread num # 切換執行緒 [Switching to thread 1 (Thread 0xb7e796c0 (LWP 2932))]#0 0xb7fe2430 in __kernel_vsyscall ()
14. 其他零散 除錯子程序。
(gdb) set follow-fork-mode child
臨時進入Shell執行命令,Exit返回。
(gdb) shell
除錯時直接呼叫函式。
(gdb) call test("abc")
使用 "--tui" 引數,可以在終端視窗上部顯示一個原始碼檢視窗。
$ gdb --tui hello
set scheduler-locking off|on|step 在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。
off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。 on 只有當前被除錯程式會執行。 step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。在GDB下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要GCC的配合。在GCC編譯程式的時候,加上-ggdb3引數,這樣,你就可以除錯巨集了。另外,你可以使用下述的GDB的巨集除錯命令 來檢視相關的巨集。
info macro – 你可以檢視這個巨集在哪些檔案裡被引用了,以及巨集定義是什麼樣的。 macro – 你可以檢視巨集展開的樣子。提示找不到原始檔:
編譯程式設計師是否加上了-g引數以包含debug資訊。 路徑是否設定正確了。使用GDB的directory命令來設定原始檔的目錄。如果要列印一個序列化過的結構體,這個序列太長的話,往往會被gdb省略掉,如:
gdb>p string
"xxxx",…"" //會有省略號出現,無法看到完整的字串
此時可以設定:
gdb>set print elements 0
再次:
gdb>p string
"xxxx","yyyy",""//顯示完整的字串
檢視命令幫助。
(gdb) help b
最後就是退出命令。
(gdb) q
和Linux Base Shell習慣一樣,對於記不住的命令,可以在輸入前幾個字母后按Tab補全。
▪ tbreak temporary breakpoint
▪ rbreak reg-ex breakpoint
▪ break xxx if yyy conditionally break at xxx if condition yyy holds
▪ commands list of commands to be executed when a breakpoint is hit
▪ silent special command to suppress output on breakpoint hit
▪ save breakpoints save a list of breakpoints to a script
▪ save history save history of executed gdb commands
▪ call call a function in the inferior
▪ watch -l watchpoint based on address (location)
▪ rwatch read watchpoint
▪ info line foo.c:42 show PC for line
▪ info line * $pc show line begin/end for current program counter
▪ thread apply all bt backtrace for every thread
▪ dprintf dynamic printf
▪ python: define custom commands by inheriting from gdb.Command class
▪ python: hook events to invoke python functions using gdb.events.stop.connect
▪ gcc’s -g and -O are orthogonal
經驗:如果某個函式的區域性變數發生訪問越界,有可能並不立即產生段錯誤,而是在函式返回時產生段錯誤。 參考: 《linux c 程式設計一站式學習》 《C 學習筆記》 by雨痕 Give me fifteen minutes and I’ll change your view of GDB
相關推薦
gdb基礎命令和常用操作補充
GDB是Unix下的一個程式除錯工具,類似於windows下面的VC偵錯程式,區別在於GDB採用全命令列控制。 使用GDB需要在編譯時使用-g選項,gcc支援-g –O選項同時使用,但如果還在除錯
Linux中常用的操作命令和vi操作命令以及gdb除錯命令
Linux簡介及Ubuntu安裝常見指令系統管理命令打包壓縮相關命令關機/重啟機器Linux管道Linux軟體包管理vim使用使用者及使用者組管理檔案許可權管理Linux簡介及Ubuntu安裝Linux,免費開源,多使用者多工系統。基於Linux有多個版本的衍生。RedHat
數據庫打開操作基本技巧命令和常用工具,php簡單調試
nav 查看連接 停止 php 調試 server 查看 serve pre 工具1:Navicat Premium 工具2:Wampserver32 基本命令打開: 展示:show databases; 創建:creat database le_data2; 使用:use
MySQL基礎概念和常用命令
MySQL的命令不區分大小寫,但建議關鍵字大寫 一、資料庫的相關概念 1、什麼是資料庫 ? 資料的倉庫 DB:database,資料庫,裡邊儲存了有組
Kafka安裝和常用操作命令
副本 創建 cer keep sta 輸出 --delete true zook Kafka安裝: 下載kafka_2.10-0.8.2.1 1.關閉防火墻 2.修改配置文件 server.properties broker.id=1log.dirs= /usr/kafk
JavaScript基礎DOM介紹和常用操作(5)
day53 參考:https://www.cnblogs.com/liwenzhou/p/8011504.html JavaScript引入方式 location物件 window.location 物件用於獲得當前頁面的地址 (URL),並把瀏覽器重定向到新的頁面。 常用屬性和
vim基礎知識和常用命令
本篇主要內容是vim的基本知識,常用命令等,不涉及需要額外安裝的外掛。 Vim的相關路徑 /usr/bin/vim /usr/share/vim/vim/vim63/ 配置檔案 /etc/vimrc,此檔案影響整個系統的Vim。 ~/.vimrc,此
2017-05-06隨記:基礎命令和符號
基礎命令2017-05-06基礎命令:1.mkdir 創建目錄 make directory -p 遞歸創建2.ls 顯示目錄中的內容,列表 list -l (小寫字母L) 顯示詳細的信息 3.pwd 顯示當前你所在的位置
oracle sqlplus命令和常用函數
width to_char sla 變量替換 init into leading greate 常用函數 常用命令: 連接sqlplus命令行下運行cmd進入,如以sys模式登陸,命令如下:(1).sqlplus "sys/zhb126 as sysdba" (2).sql
【Linux相識相知】計算機的組成、linux發行版和哲學思想、基礎命令和目錄結構
知識 sun pro 復制 val 算術 uil cdr type 從今天開始,Frank將開始在博客上記錄自己學習linux的點點滴滴,F初來乍到,還望各位大佬多多指教。本次博客的主要內容如下: 計算機基礎:簡要的描述了計算機的組成及其功能; linux初
[轉載] Delphi StringGrid常用屬性和常用操作
有關 del ons 關聯 ddr tabs then form 水平分割 StringGrid組件用於建立顯示字符串的網格,與電子表格相似。它可使表格中的字符串和相關對象操作簡單化。StringGrid組件提供了許多可控制網格外觀念的屬性,以及利用表格的結構響應用戶操作的
CentOS 7常見的基礎命令和配置
系統 centos 7管理服務命令格式:systemctl COMMAND name.service 註意:以下name.service表示某個具體服務啟動:service name start ==> systemctl start name.service停止:service name sto
Linux基礎命令和NAT技術
packages bootp 無法 子網掩碼 本地 ont 證書 子網 ash yum yellowdog updater,modified是一種用python寫的基於rpm的管理工具 用於解決rpm包的依賴性 要安裝編譯工具 yum install gcc
Jquery5 基礎 DOM 和 CSS 操作
而在 script 清理 位置 this clas radi 獲取 spa 學習要點: 1.DOM 簡介 2.設置元素及內容 3.元素屬性操作 4.元素樣式操作 5.CSS 方法 DOM 是一種文檔對象模型。方便開發者對HTML 結構元素內容進行展示和修改。在 Java
docker基本命令和基本操作命令
docker-教程 docker程式設計環境小書匠 docker 教程 Docker官方英文資源 docker官網:http://www.docker.com Docker windows入門:https://docs.docker.com/windows/
redis的資料型別List,其原生命令和php操作Redis List函式介紹
List型別介紹 List是簡單的字串列表,按照插入順序排序,可以從列表的兩頭新增資料,一個列表最多可以包含2^32-1個元素(超過40億個元素) List原生命令 命令 命令描述 例項 LPUSH key value1 [va
Linux常用命令與常用操作
文件的 登陸 找文件 相關 日誌 -- 灰色 常用操作 單個字符 常用命令 普通命令 file 查看文件類型 pwd 打印當前目錄 ping 發數據包 touch
rsync3.1.3的編譯安裝和常用操作
1.rsync的編譯安裝 tar -zxf rsync-3.1.3.tar.gz cd rsync-3.1.3 ./configure --prefix=/usr/local/rsync-3.1.3 --disable-ipv6 2.rsync的配置檔案: [[email p
Redis的資料型別和常用操作
五大資料型別 字串:String String是Redis最基本的型別,一個Key對應一個Value String型別是二進位制安全的,意思是Redis的String可以包含任何資料,例如一張jpg格式的圖片或者一個序列化的物件 一個Redis的字串型別Value
string物件的初始化和常用操作
1、初始化string物件的方式 1 #include <iostream> 2 #include <string> 3 4 using std::cout; 5 using std::endl; 6 using std::string; 7 void outp