GDB tbreak命令
默认情况下,程序不会进入调试模式,代码会瞬间从开头执行到末尾。要想观察程序运行的内部细节(例如某变量值的变化情况),可以借助 GDB 调试器在程序中的某个地方设置断点,这样当程序执行到这个地方时就会停下来。 所谓断点(BreakPoint),读者可以理解为障碍物,人遇到障碍物不能行走,程序遇到断点就暂停执行。 在 GDB 调试器中对 C、C++ 程序打断点,最常用的就是 break 命令,有些场景中还会用到 tbreak 或者 rbreak 命令,本节将对这 3 个命令的功能和用法做详细的讲解。 为了让大家更好地了解给程序打断点的作用,这里以一段完整的 C 语言程序为例:
/tmp/demo/main.c 文件中,并已经生成了具备调试信息的 main.exe 可执行文件:
[root@bogon demo]# ls main.c main.exe [root@bogon demo]# gdb main.exe -q Reading symbols from main.exe... (gdb) GDB break命令break 命令(可以用 b 代替)常用的语法格式有以下 2 种。1、(gdb) break location // b location 2、(gdb) break ... if cond // b .. if cond 1) 第一种格式中,location 用于指定打断点的具体位置,其表示方式有多种,如表 1 所示。
(gdb) l 1 #include<stdio.h> 2 int main(int argc,char* argv[]) 3 { 4 int num = 1; 5 while(num<100) 6 { 7 num *= 2; 8 } 9 printf("num=%d",num); 10 return 0; (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 5 while(num<100) (gdb) b 7 if 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
tbreak 命令可以看到是 break 命令的另一个版本,tbreak 和 break 命令的用法和功能都非常相似,唯一的不同在于,使用 tbreak 命令打的断点仅会作用 1 次,即使程序暂停之后,该断点就会自动消失。 tbreak 命令的使用格式和 break 完全相同,有以下 2 种:1、(gdb) tbreak location 2、(gdb) tbreak ... if cond 其中,location、... 和 cond 的含义都和 break 命令中的参数含义相同,即表 1 也同样适用于 tbreak 命令。 仍以 main.exe 为例,如下演示了 tbreak 命令的用法:(gdb) tbreak 7 if num>10 Temporary breakpoint 1 at 0x1165: file main.c, line 7. (gdb) r Starting program: /home/ubuntu64/demo/main.exe Temporary breakpoint 1, main (argc=1, argv=0x7fffffffe088) at main.c:7 7 num *= 2; (gdb) p num $1 = 16 (gdb) c <-- 继续执行程序,则原使用 tbreak 在第 7 行打的断点将不再起作用 Continuing. num=128[Inferior 1 (process 6534) exited normally] (gdb) 可以看到,自num=16 开始,后续循环过程中 num 的值始终大于 10,则num>10 表达式的值永远为 True,理应在第 7 行暂停多次。但由于打断点采用的是 tbreak 命令,因此断点的作用只起 1 次。![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |