GDB是一个调试程序,可以用来调试C/C++程序。这个C/C++要产生符号表才能使用GDB调用。例如C++:
g++ -g source.cpp
GDB常用命令
首先要生成一个有调试符号的ELF文件(exe curable and linkable format),简单点说就是一个带调试符号可执行文件。加-g
参数进行编译。
hello.cpp:
──(kali㉿kali)-[~/dev/Bear]
└─$ g++ -o world -g hello.cpp
──(kali㉿kali)-[~/dev/Bear]
└─$ ls
world hello.cpp
启动gdb调试程序
──(kali㉿kali)-[~/dev/Bear]
└─$ gdb
为了方便我们调试,在开始调前运行layout next
这个命令将显示程序中当前位置周围的源代码。这个视图对那些刚接触gdb的人很有帮助,特别是在处理您不熟悉的源代码时。
在启动GDB后,第一次输入
(gdb) layout next
再重复执行 layout next
,将显示汇编语言的程序。
layout prev
这个命令就是回到上一个模式。
使用world文件作为调试,使用file文件来读入调试用的文件world的符号
使用file将用作调试的文件的符号载入
(gdb) file world
Reading symbols from world...
设置断点
断点在特定的行数:
(gdb) break 2
(gdb) break 7
也可以断点在函数上:
(gdb) break main
运行world程序
(gdb) run world
或传些一参数给world程序:
(gdb) run world "ling ling"
使用next命令运行到下一行
(gdb) next
如果遇到一个函数调用,想进去看看,就可以用step
(gdb) step
如果已进入函数,然后不想继续看了,想回到它被调用的地方,就可以用finish
(gdb) finish
如果要回到调用点,可以使用return命令:
使用print检查一些变量的值
除了使用print检查一些变量的值,还可以使用display,与print的不同的是它会在每条指令之后重新打印信息。
使用clear清掉断点
如清掉第7行的断点
(gdb) clear 7
或者清点某个方法名上的断点:
(gdb) clear main
bt显示函数调用堆栈,即自到达这一行以来运行过的每个函数,即显示函数调用栈。
(gdb) bt
continue命令用于从断点停止的地方继续继续,直到下一个断点。
(gdb) continue
frame [number] goes to the selected frame in the call stack.
使用list命令,打印当前源文件中当前行周围的区域。显示当前行和调用的函数堆栈
quit或者exit都是gdb调试程序。
上面这些命令是用得比较普遍的。更高级的使用可以通过help命令来找到更多有用的信息
(gdb) help
通过help命令就可以了解更多高级应用。在此就不再展开了。gdb学习起来还是很容易的。