gdb 预备知识
1.gcc的-g选项
如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码调试信息编译到可执行文件中。
#include <stdio.h> int main(void)
{
int i = ;
i = i + ;
printf("i = %d\n",i);
return ;
}
如果使用-g选项:
gcc -g main.c
$ gdb a.out
(gdb) b main
Breakpoint 1 at 0x4004fc: file main.c, line 5.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, main () at main.c:5
5 int i = 1;
(gdb) n
6 i = i + 1;
(gdb)
7 printf("i = %d\n",i);
(gdb)
i = 2
8 return 0;
(gdb)
2.上下移动调用栈 //不怎么熟悉,蛮有用的工具
frame 1
当执行GDB的frame命令时,当前正在执行的函数的帧被编号为0,其父帧被编号为1,父帧的父帧被编号为2,以此类推。GDB
#include <stdio.h> void display(int i)
{
printf("i = %d\n",i);
} int main(void)
{
int i = ;
i = i + ;
display(i);
return ;
}
Breakpoint 1 at 0x4004ff: file main.c, line 5.
(gdb) frame
No stack.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 0
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 1
#1 0x0000000000400535 in main () at main.c:12
12 display(i);
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) up
#1 0x0000000000400535 in main () at main.c:12
12 display(i);
(gdb) down
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) bt
#0 display (i=2) at main.c:5
#1 0x0000000000400535 in main () at main.c:12
3.gdbinit
使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这时候可以使用gdbinit脚本。
如下脚本:
#filename: .gdbinit
file a.out
b display
r
有两种方式来使用这个脚本:
1)启动gdb时候
gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",
这样在启动的时候就会处理这些命令。
将脚本保存为.gdbinit,放在main.c同一目录下,执行gdb命令:
$ gdb
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb)
2)gdb运行期间
可以使用 source script-file 来解释gdb命令脚本script-file
将脚本保存为gdbscript,放在main.c同一目录下:
$ gdb
(gdb) source gdbscript
Breakpoint 1 at 0x4004ff: file main.c, line 5.
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb)
最新文章
- python学习6
- java 4种方式读取配置文件 + 修改配置文件
- python virtualenv 安装运行saltstack
- Javascript异步编程的4种方法
- Tomcat 长连接与短连接性能测试
- TCP/IP详解 学习二
- LINUX中,Vi编辑器的几种模式及保存、退出等命令
- mysql max_allowed_packet自动重置为1024 终结解决
- 最近用unity5弄的一些渲染
- linux下curl编程
- KVM内核文档阅读笔记
- Python 版本管理anaconda
- [转]centos6.5修改yum安装的mysql默认目录
- 让Mysql支持Emoji表情,解决[Err] 1366 - Incorrect string value: &#39;\xF0\xA3\x84\x83&#39;
- linux debian 9 / centos 7配置postgresSQL数据库
- <;数据结构与算法分析>;读书笔记--要分析的问题
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
- xgboost原理及应用--转
- 7.1 服务暴露前的准备-ServiceBean的装配
- MAC下安装MAMP后,mysql server无法启动