1. 程式人生 > 實用技巧 >gdb除錯

gdb除錯

生成除錯程式

準備一個.c 或.cpp檔案
gcc program.c
gcc -g program.c

g++ program.cpp
g++ -g program.c
引數 -g 生成可執行檔案可用於gdb除錯
引數 -o 指定生成檔名

常用操作

檢視程式
list/l 行號 函式
執行
run/r quit/q
斷點
breakpoints/b 行號 函式名
info/i b 檢視斷點
delete b 序號
除錯
next/n 步進
step/s 步入
continue/c 執行到下個斷點
檢視除錯資訊
print/p 變數 函式
display 變數 
undisplay 變數
breaktrace/bt 函式呼叫
i locals 當前函式區域性變數的值
i registers 檢視暫存器
skip function

gdb多程序除錯

比常用操作多了

set detach-on-fork off          允許多進行除錯
info inferiors			檢視程序
inferior num			切換程序

gdb多執行緒除錯

多執行緒操作需要新增 -lpthread選項。原因是pthread不是linux下的預設庫,不加選項就會在連結時找不到pthread庫的入口地址,導致連結失敗
gcc -g program.c -o program -lpthread

比常規操作多了

info threads			檢視執行緒
thread num			切換執行緒【執行緒近似併發,切換到某執行緒並不會影響其他執行緒的執行】
建立執行緒會出現

[New Thread 0x7ffff77f0700 (LWP 25991)]
這裡的LWP表示這是輕量級執行緒 後面的25991是執行緒號
檢視執行緒可以用
ps -aL

####### 測試過的兩個例子
set scheduler-locking on 只運行當前執行緒
set scheduler-locking off 所有執行緒同步執行
對複雜一點的程式沒什麼用

在docker內部使用gdb

在建立容器時加上 --privileged=true 選項

docker下不加上述選項為什麼gdb會失敗的原因
https://www.jianshu.com/p/7ba162b700ca