(gdb) l <-- 显示带行号的源代码 1#include <stdio.h> 2 int main () 3 { 4 unsigned long long int n, sum; 5 n = 1; 6 sum = 0; 7while (n <= 100) 8 { 9 sum = sum + n; 10 n = n + 1; (gdb) <-- 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,安装 Enter 回车即可 11 } 12return0; 13 } (gdb) b 7 <-- 在第 7 行源代码处打断点 Breakpoint 1 at 0x400504: file main.c, line 7. (gdb) r <-- 运行程序,遇到断点停止 Starting program: /home/mozhiyan/demo1/main.exe
Breakpoint 1, main () at main.c:7 7while (n <= 100) Missing separate debuginfos, use: debuginfo-install glibc-2.17-55.el7.x86_64 (gdb) p n <-- 查看代码中变量 n 的值 $1 = 1 <-- 当前 n 的值为 1,$1 表示该变量所在存储区的名称 (gdb) b 12 <-- 在程序第 12 行处打断点 Breakpoint 2 at 0x40051a: file main.c, line 12. (gdb) c <-- 继续执行程序 Continuing.
Breakpoint 2, main () at main.c:12 12return0; (gdb) p n <-- 查看当前 n 变量的值 $2 = 101 <-- 当前 n 的值为 101 (gdb) q <-- 退出调试 A debugging session is active.
Inferior 1 [process3080] will be killed.
Quit anyway? (y or n) y <-- 确实是否退出调试,y 为退出,n 为不退出 [root@bogondemo]#
(gdb) l 1#include<stdio.h> 2 int main(int argc,char* argv[]) 3 { 4 int num = 1; 5while(num<100) 6 { 7 num *= 2; 8 } 9 printf("num=%d",num); 10return0; (gdb) 11 } (gdb) b 4 <-- 程序第 4 行打断点 Breakpoint 1 at 0x1138: file main.c, line 4. (gdb) r <-- 运行程序,至第 4 行暂停 Starting program: /home/ubuntu64/demo/main.exe
Breakpoint 1, main (argc=1, argv=0x7fffffffe078) at main.c:4 4 int num = 1; (gdb) b +1 <-- 在第 4 行的基础上,在第 5 行代码处打断点 Breakpoint 2 at 0x55555555513f: file main.c, line 5. (gdb) c <-- 继续执行程序,至第 5 行暂停 Continuing.
Breakpoint 2, main (argc=1, argv=0x7fffffffe078) at main.c:5 5while(num<100) (gdb) b 7if num>10 <-- 如果 num>10 在第 7 行打断点 Breakpoint 3 at 0x555555555141: file main.c, line 7. (gdb) c <-- 继续执行 Continuing.
Breakpoint 3, main (argc=1, argv=0x7fffffffe078) at main.c:7 7 num *= 2; <-- 程序在第 7 行暂停 (gdb) p num <-- p 命令查看 num 当前的值 $1 = 16 <-- num=16
(gdb) l <--列出要调试的程序源码 1#include<stdio.h> 2 int main(int argc,char* argv[]) 3 { 4 int num = 1; 5while(num<=100) 6 { 7 num *= 2; 8 } 9 printf("%d",num); 10return0; (gdb) 11 } (gdb) b 4 <-- 使用 break 命令打断点 Breakpoint 1 at 0x115c: file main.c, line 4. (gdb) r <-- 执行程序 Starting program: /home/ubuntu64/demo/main.exe
Breakpoint 1, main (argc=1, argv=0x7fffffffe088) at main.c:4 4 int num = 1; (gdb) watch num <-- 监控程序中 num 变量的值 Hardware watchpoint 2: num (gdb) c <-- 继续执行,当 num 值发生改变时,程序才停止执行 Continuing.
Hardware watchpoint 2: num
Old value = 0 New value = 2 main (argc=1, argv=0x7fffffffe088) at main.c:5 5while(num<=100) (gdb) c <-- num 值发生了改变,继续执行程序 Continuing.
Hardware watchpoint 2: num
Old value = 2 New value = 4 main (argc=1, argv=0x7fffffffe088) at main.c:5 5while(num<=100) (gdb)
不带参数的 until 命令 : (gdb) until
可以使 GDB 调试器快速运行完当前的循环体,并运行至循环体外停止。注意,until 命令并非任何情况下都会发挥这个作用,只有当执行至循环体尾部(最后一行代码)时,until 命令才会发生此作用;反之,until 命令和 next 命令的功能一样,只是单步执行程序。
#include<stdio.h> intprint(int num){ int ret = num * num; return ret; } intmyfunc(int num){ int i = 1; int sum = 0; while(i <= num){ sum += print(i); i++; } return sum; } intmain(){ int num =0; scanf("%d", &num); int result = myfunc(num); printf("%d", result); return0; }
(gdb) b 17 Breakpoint 1 at 0x1201: file main.c, line 17. (gdb) r Starting program: ~/demo/main.exe
Breakpoint 1, main () at main.c:17 17 scanf("%d", &num); (gdb) u 3 18 int result = myfunc(num); (gdb) step myfunc (num=3) at main.c:7 7 int i = 1; (gdb) u 8 int sum = 0; (gdb) u 9while(i <= num){ (gdb) u 10 sum += print(i); (gdb) u 11 i++; (gdb) u <-- 执行 i++ 操作 9while(i <= num){ (gdb) u <-- 快速执行完循环体 13return sum; (gdb) p sum $1 = 14
可以看到,这里当程序单步执行完第 11 行代码时,借助 until 命令快速执行完了整个循环体,并在第 13 行代码处停止执行。根据 p 命令输出的 num 变量的值可以确认,整个循环过程确定完整地执行完了。