首页 > 代码库 > gdb调试
gdb调试
1 GDB的主要功能:
A启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
B可以让被调试的程序在你所指定的调试的断点处停住。(断点可以是条件表达式)
C当程序被停止住是,可以检查此时你的程序中所发生的事。
D动态的改变你程序的执行环境。
2载入程序的两种方式
前提:编译程序的时候加上了调试命令 -g,比如gcc demo.c–g app
A在启动gdb后(也就是说在终端窗口先执行gdb这个命令),接着执行以下命令:
file可执行文件路径 比如:在当前路径下有app,那么命令就是:fileapp
toto@toto-pc:~/test$ gdb GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 Copyright (C) 2014 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-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) file app |
B在gdb启动时就载入程序:
toto@toto-pc:~/test$ gdb app GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 Copyright (C) 2014 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-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from app...done. (gdb) |
3一个调试示例(test.c)
#include<stdio.h>
int func(int n) { int sum = 0,i; for(i = 0;i < n;i++) { sum += i; }
return sum; }
int main(void) { int i; long result = 0; for(i = 1; i <= 100; i++) { result += i; }
printf("result[1-100] = %d \n",result); printf("result[1-250] = %d \n",func(250)); } |
编译生成执行文件(Linux):
gcc -g test.c -o test
使用GDB调试:
gdb test
toto/test> gdb tst <----------启动GDB Breakpoint 1, main () at tst.c:17 <----------在断点处停住。 Breakpoint 2, func (n=250) at tst.c:5 Program exited with code 027. <--------程序退出,调试结束。 |
4 运行GDB
gdb <program>program也就是你的执行文件,一般在当前目录下。
gdb <program>core用dbc同时调用一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
gdb <program><PID> -- 调用正在运行的程序。Program为需要调用的程序文件,PID为当前正在运行的程序。或是先用gdb <program>关联源代码进入gdb,后用attatch命令来挂接进程PID,并用detach来取消挂接的进程。
5常用命令
命令 | 简写 | 作用 |
help | h | 按模块列出命令类 |
help class |
| 查看某一类型的具体命名 |
list | l | 查看代码,可跟行号和函数名 |
quit | q | 退出gdb |
run | r | 全速运行程序 |
step | s | 逐语句执行,遇到函数,跳到函数内执行 |
backtrace | bt | 查看函数的调用的栈帧和层级关系。 |
info | i | 查看函数内部局部变量的数值 |
frame | f | 切换函数的栈帧 |
finish |
| 结束当前函数,返回函数调用点 |
set |
| 设置变量的值 |
run argv[1] argv[2] |
| 调试时命令行传参 |
p | 打印变量和地址 | |
break | b | 设置断点,可根据行号和函数名 |
delete | d | 删除断点,d breakpoints NUM |
display |
| 设置观察变量 |
undisplay |
| 取消观察变量 |
continue | c | 继续全速运行剩下的代码 |
enable breakpoints |
| 启用断点 |
disable breakpoints |
| 禁用断点 |
x |
| 查看没存 x/20xw 显示20个单元,16进制,4字节每单元 |
watch |
| 被设置观察点的变量发生修改时,打印显示。 |
i watch |
| 现实观察点 |
core |
| ulimit –c 1024开启core文件,调试时gdb a.out core |
6 gdb调试模式
run全速运行
start单步调试
gdb调试