东莞长安网站建设,做家具定制的设计网站,免费网络空间,天博网站建设基本命令
1#xff09;进入GDB #gdb test test是要调试的程序#xff0c;由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。
2#xff09;查看源码 (gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数#xff0c;在l后加上函数名即可定位到这…基本命令
1进入GDB #gdb test test是要调试的程序由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。
2查看源码 (gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者使用断点或单步运行到某个函数处使用s进入这个函数。
3设置断点 (gdb) b 6 这样会在运行到源码第6行时停止可以查看变量的值、堆栈情况等这个行号是gdb的行号。 4查看断点处情况 (gdb) info b 可以键入info b来查看断点处情况可以设置多个断点
5运行代码 (gdb) r
6显示变量值 (gdb) p n 在程序暂停时键入p 变量名(print)即可 GDB在显示变量值时都会在对应值之前加上$N标记它是当前变量值的引用标记以后若想再次引用此变量就可以直接写作$N而无需写冗长的变量名
7观察变量 (gdb) watch n 在某一循环处往往希望能够观察一个变量的变化情况这时就可以键入命令watch来观察变量的变化情况GDB在n设置了观察点
8单步运行 (gdb) n
9程序继续运行 (gdb) c 使程序继续往下运行直到再次遇到断点或程序结束
10退出GDB (gdb) q (gdb) break (b) 在源代码指定的某一行设置断点其中xxx用于指定具体打断点位置 (gdb) run (r 执行被调试的程序其会自动在第一个断点处暂停执行。 (gdb) continue (c 当程序在某一断点处停止后用该指令可以继续执行直至遇到断点或者程序结束。 (gdb) next (n) 令程序一行代码一行代码的执行。 (gdb) steps 如果有调用函数进入调用的函数内部否则和 next 命令的功能一样。 (gdb) until (u) (gdb) until (u) location 当你厌倦了在一个循环体内单步跟踪时单纯使用 until 命令可以运行 程序直到退出循环体。 until n 命令中n 为某一行代码的行号该命令会使程序运行至第 n 行代码处停止。 (gdb) print (p 打印指定变量的值其中 xxx 指的就是某一变量名。 (gdb) list (l) 显示源程序代码的内容包括各行代码所在的行号。 (gdb) finishfi 结束当前正在执行的函数并在跳出函数后暂停程序的执行。 (gdb) returnreturn 结束当前调用函数并返回指定值到上一层函数调用处停止程序执行。 (gdb) jumpj) 使程序从当前要执行的代码处直接跳转到指定位置处继续执行后续的代码。 (gdb) quit (q) 终止调试。
代码举例如下
$ ls
main.cpp
$ g -g -o test main.cpp
$ ls
main.cpp test
$ gdb test -- 启动gdb进行调试
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type show copying
and show warranty for details.
This GDB was configured as x86_64-redhat-linux-gnu.
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /home/zhuyong/project/linux/blog/gdb/test...done.
(gdb)$ gdb test -q -- 启动gdb进行调试
Reading symbols from /home/zhudi/project/linux/blog/gdb/test...done.
(gdb) l -- 显示带行号的源代码
1 #include iostream
2 using namespace std;
3
4 int main() {
5 int sum 0;
6 int n 1;
7 while (n 100) {
8 sum n;
9 n;
10 }
(gdb) -- 默认情况下l 选项只显示 10 行源代码如果查看后续代码按 Enter 回车键即可
11 cout sum sum endl;
12
13 return 0;
14 }
15
(gdb) b 7 -- 在第7行源代码处打断点
Breakpoint 1 at 0x4008d3: file main.cpp, line 7.
(gdb) r -- 运行程序遇到断点停止
Starting program: /home/zhudi/project/linux/blog/gdb/testBreakpoint 1, main () at main.cpp:7
7 while (n 100) {
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-39.el7.x86_64 libstdc-4.8.5-39.el7.x86_64
(gdb) print n -- 查看代码中变量 n 的值
$1 1 -- 当前 n 的值为 1$1 表示该变量 表示该变量所在存储区的名称
(gdb) b 13
Breakpoint 2 at 0x40090e: file main.cpp, line 13.
(gdb) n -- 单步执行程序
8 sum n;
(gdb) n -- 单步执行程序
9 n;
(gdb) c -- 继续执行程序
Continuing.
sum 5050Breakpoint 2, main () at main.cpp:13
13 return 0;
(gdb) print sum -- 查看 sum 的值
$2 5050 -- 当前 sum 的值为 5050
(gdb) q -- 退出调试
A debugging session is active.Inferior 1 [process 8449] will be killed.Quit anyway? (y or n) y -- 确认是否退出调试y 为退出n 为不退出