table of contents
除錯時呼叫函式
觀察點gdb巨集
除錯是一項複雜的任務。開發人員大部分時間都花在除錯上,因此熟悉許多除錯工具很重要
在linux中,本機偵錯程式是gdb,它是基於命令列的,看起來醜陋而原始。許多開發人員,尤其是那些從windows移走並使用visual studio等工具的開發人員,都沒有給gdb乙個機會。
gdb是基於命令列的,您需要學習命令,並且看起來像在80年代進行除錯,但是有些任務只能用gdb來完成
我們將使用以下**:
#include#define addnum(a,b) ((a)+(b))
#define max(a,b) (a)>(b)?(addnum(a,100)):(addnum(b,50))
int a1=10,a2=20;
void f2()
void print_dbg()
int add(int a, int b)
void f1()
*p=100;
}int arr[1000];
void main()
當gdb在斷點處停止或執行**時,您可以呼叫帶有或不帶有引數的函式。
(gdb) b add
breakpoint 1 at 0x400654: file ./a.c, line 21.
(gdb) r
a1=10 a2=20
breakpoint 1, add (a=80, b=90) at ./a.c:21
21 int c= a+90;
(gdb) call print_dbg()
a1=10 a2=20
(gdb) delete breakpoints
delete all breakpoints? (y or n) y
(gdb) b a.c:34
breakpoint 2 at 0x4006bd: file ./a.c, line 34.
(gdb) c
continuing.
breakpoint 2, f1 () at ./a.c:34
34 a1++;
(gdb) call add(2,3)
$1 = 95
gdb的主要功能之一是能夠在更改某些內容時中斷。它可以是變數,位址或暫存器:
(gdb) watch a1
hardware watchpoint 1: a1
(gdb) r
a1=10 a2=20
hardware watchpoint 1: a1
old value = 10
new value = 11
f1 () at ./a.c:35
35 f2();
**位址變更
(gdb) p &arr
$1 = (int (*)[1000]) 0x601080
然後要求gdb在該位址的內容更改時停止
(gdb) watch *0x601080
hardware watchpoint 1: *0x601080
(gdb) r
hardware watchpoint 1: *0x601080
old value = 0
new value = 1
main () at ./a.c:43
43 f1();
觀察點註冊變更
使用暫存器也可以這樣做。
(gdb) watch $rax
watchpoint 1: $rax
(gdb) c
continuing.
watchpoint 1: $rax
old value = 4196067
new value = 0
0x00000000004006f6 in main () at ./a.c:43
43 f1();
使用.gdbinit檔案,您還可以為除錯會話定義新命令(巨集)。例如,如果您將以下內容寫入.gdbinit:
define irg
info registers
info threads
end
define pdb
print a1
print a2
call print_dbg()
end
它定義了兩個可以使用的新巨集– pdb,irg
(gdb) pdb$2 = 10
$3 = 20
a1=10 a2=20
(gdb) irg
rax 0x0 0
rbx 0x0 0
rcx 0x6f77206f6c6c6568 8031924123371070824
rdx 0x7ffff7dd3780 140737351858048
rsi 0x5a 90
rdi 0x50 80
rbp 0x7fffffffdb50 0x7fffffffdb50
rsp 0x7fffffffdb50 0x7fffffffdb50
r8 0x0 0
r9 0xd 13
r10 0x0 0
r11 0x246 582
r12 0x4004e0 4195552
r13 0x7fffffffdc60 140737488346208
r14 0x0 0
r15 0x0 0
rip 0x400654 0x400654 eflags 0x246 [ pf zf if ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
id target id frame
gdb除錯(四)函式呼叫棧之 frame
函式呼叫棧由連續的棧幀組成。每個棧幀記錄乙個函式呼叫的資訊,這些資訊包括函式引數,函式變數,函式執行位址。當程式啟動後,棧中只有乙個幀,這個幀就是main函式的幀。我們把這個幀叫做初始化幀或者叫做最外層幀。每當一 個函式被呼叫,乙個新幀將被建立,每當乙個函式返回時,函式幀將被剔除。如果函式是個遞迴函...
通過gdb來除錯和觀察redis原始碼的執行
本文介紹如何通過gdb來除錯redis的源 相對於只是檢視原始碼,通過gdb還能夠在實際場景中觀察 如何執行,記憶體如何變化,這對於理解redis server的執行機制非常有必要。在進行redis server一般命令的執行機制除錯時,不需要你精通c c 程式設計,只需要知道gdb的一些基本命令就...
執行緒的檢視以及利用gdb除錯多執行緒
gdb除錯常用命令,attach,br,n,bt 在oceanbase除錯中,必須用到gdb,將常用命令蒐集記錄如下 1.attach 用gdb除錯乙個正在執行中的程序 gdb pid 2.br 設定斷點 br filename line num br namespace classname fun...