GDB是调试命令工具
前提:编译的时候需要-g
使用:
- gdb a.out
- 或者gdb先进入,再输入file a.out
常用命令
gcc -g #使用该参数编译可执行文件,得到调试表
gdb a.out
gdb 命令行
-
help:查看命令帮助,简写h。help + 命令
-
run:开始运行程序,简写r。run args[1] args[2] …
-
start:开始运行程序,单步执行,停在第一执行语句。 start args[1] args[2] …
-
list:查看原代码,简写l。list n,从第n行开始查看代码。list 函数名,查看具体函数。
-
set:设置变量的值,set args 1 2 3 4
-
next:单步调试(逐过程,函数直接执行),简写n
-
step:单步调试(逐语句:跳入自定义函数内部执行),简写s
-
backtrace:查看函数的调用的栈帧和层级关系,简写bt!!!
-
frame:切换函数的栈帧,简写f!!!
-
info:查看函数内部局部变量的数值,简写i
-
finish:结束当前函数,返回到函数调用点
-
continue:继续运行,简写c
-
print:打印值及地址,简写p。栈帧概念??backtrace,frame
-
ptype x:打印变量类型,只能查看局部变量。栈帧概念??backtrace,frame
-
quit:退出gdb,简写q
-
break+num:在第num行设置断点,简写b, break num if i = 5(设置条件断点)
-
info breakpoints:查看当前设置的所有断点,info b
-
delete breakpoints num:删除第num个断点,简写d
-
display i:追踪查看具体变量值, 跟踪变量i
-
undisplay n:取消追踪观察变量,取消跟踪第n个变量
-
watch i:跟踪变量i,被设置观察点的变量发生修改时,打印显示
-
enable breakpoints n:启用断点
-
disable breakpoints n:禁用断点
-
x:查看内存x/20xw 显示20个单元,16进制,4字节每单元
使用场景
void insertionSort(int* nums,int numsSize){
int i,j,key;
for(i=0;i<numsSize;i++){
key = nums[i];
for(j=i-1;j>=0&&key<nums[j];j--)
nums[j+1] = nums[j];
nums[j+1] = key;
}
}
int main(int argc,char **argv){
int nums[] = {9,2,6,1,4,7,10,3};
insertionSort(nums,sizeof(nums)/sizeof(int));
insertionSort(nums,sizeof(nums)/sizeof(int));
return 0;
}
- 设置断点break, 查看断点, 删除断点, 禁用断点
(gdb) l 1
1
2 void insertionSort(int* nums,int numsSize){
3 int i,j,key;
4 for(i=0;i<numsSize;i++){
5 key = nums[i];
6 for(j=i-1;j>=0&&key<nums[j];j--)
7 nums[j+1] = nums[j];
8 nums[j+1] = key;
9 }
10 }
(gdb)
11
12 int main(int argc,char **argv){
13 int nums[] = {9,2,6,1,4,7,10,3};
14
15 insertionSort(nums,sizeof(nums)/sizeof(int));
16
17 insertionSort(nums,sizeof(nums)/sizeof(int));
18
19 return 0;
20 }
(gdb) b 8
Breakpoint 1 at 0x105a0: file test.c, line 8.
(gdb) run
Starting program: /home/lyg001/test
Breakpoint 1, insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:8
8 nums[j+1] = key;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000105a0 in insertionSort at test.c:8
breakpoint already hit 1 time
(gdb) delete breakpoint 1
(gdb) b 4
Breakpoint 2 at 0x10508: file test.c, line 4.
(gdb) c
Continuing.
Breakpoint 2, insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x00010508 in insertionSort at test.c:4
breakpoint already hit 1 time
(gdb) disable breakpoint 2
(gdb) c
Continuing.
[Inferior 1 (process 12922) exited normally]
(gdb) quit
- 追踪变量display
(gdb) display i
No symbol "i" in current context.
(gdb) s
15 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) display i
1: i = -1226347948
(gdb) s
5 key = nums[i];
1: i = 0
(gdb) s
6 for(j=i-1;j>=0&&key<nums[j];j--)
1: i = 0
(gdb) s
8 nums[j+1] = key;
1: i = 0
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1: y i
(gdb) finish
Run till exit from #0 insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:8
main (argc=1, argv=0xbefff564) at test.c:17
17 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
1: i = 8
(gdb) s
5 key = nums[i];
1: i = 0
(gdb) undisplay 1
(gdb) s
6 for(j=i-1;j>=0&&key<nums[j];j--)
(gdb) c
Continuing.
[Inferior 1 (process 13434) exited normally]
(gdb) quit
display必须在当前函数帧有同名变量。
当切换到不同函数帧时,还会显示同名变量。
- 追踪变量watch
(gdb) watch i
No symbol "i" in current context.
(gdb) start
Temporary breakpoint 1 at 0x105f8: file test.c, line 13.
Starting program: /home/lyg001/test
Temporary breakpoint 1, main (argc=1, argv=0xbefff564) at test.c:13
13 int nums[] = {9,2,6,1,4,7,10,3};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) watch i
No symbol "i" in current context.
(gdb) s
15 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) watch i
Hardware watchpoint 2: i
(gdb) s
Hardware watchpoint 2: i
Old value = -1226347948
New value = 0
0x00010510 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) s
5 key = nums[i];
(gdb) s
6 for(j=i-1;j>=0&&key<nums[j];j--)
(gdb) s
8 nums[j+1] = key;
(gdb) s
4 for(i=0;i<numsSize;i++){
(gdb) s
Hardware watchpoint 2: i
Old value = 0
New value = 1
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0 0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i
Old value = 1
New value = 2
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0 0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i
Old value = 2
New value = 3
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0 0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i
Old value = 3
New value = 4
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i
Old value = 4
New value = 5
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i
Old value = 5
New value = 6
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i
Old value = 6
New value = 7
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i
Old value = 7
New value = 8
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
main (argc=1, argv=0xbefff564) at test.c:17
17 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
[Inferior 1 (process 13747) exited normally]
watch,必须在当前函数帧有同名变量。相当于break + print
当离开该函数帧后,不再生效
- 切换函数栈帧
(gdb) backtrace
No stack.
(gdb) start
Temporary breakpoint 1 at 0x105f8: file test.c, line 13.
Starting program: /home/lyg001/test
Temporary breakpoint 1, main (argc=1, argv=0xbefff564) at test.c:13
13 int nums[] = {9,2,6,1,4,7,10,3};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) backtrace
#0 main (argc=1, argv=0xbefff564) at test.c:13
(gdb) s
15 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) backtrace
#0 insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
#1 0x00010628 in main (argc=1, argv=0xbefff564) at test.c:15
(gdb) print i
$1 = -1226347948
(gdb) frame 1
#1 0x00010628 in main (argc=1, argv=0xbefff564) at test.c:15
15 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) print i
No symbol "i" in current context.
(gdb) frame 0
#0 insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4 for(i=0;i<numsSize;i++){
(gdb) print i
$2 = -1226347948
(gdb) finish
Run till exit from #0 insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
main (argc=1, argv=0xbefff564) at test.c:17
17 insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) backtrace
#0 main (argc=1, argv=0xbefff564) at test.c:17
(gdb) c
Continuing.
[Inferior 1 (process 14200) exited normally]
(gdb) quit
backtrace, frame, 切换函数帧, 才能打印想要的变量