gdb之初识
2015-08-16 21:24
330 查看
1. gdb是什么
以前在windows下开发的时候一直都使用的windows的编辑器(VS), 调试则使用的IDE自带的调试手段,
F9: 设置断点
F5: 执行直到遇到断点
F10: 单步执行
F11: 单步且遇到函数则进入函数
shift+F5: 跳出调试模式
只记录基础的,如果以后再去windows上开发则做补充。
gdb是Linux调试的工具,灰常强大。 关于gdb这个版块不是一次直接写完,先把用的部分写出来一点,以后用到就补充。
2. gdb基础使用
# vi one.c
# gcc -g -Wall -Werror one.c -o one // 必须要加 -g 选项, 否则不会加载符号表之类的,调试不方便
# gdb one
(gdb) l 10 // list, 列出程序 : 列出后面10行
6 }
7
8 void fun2(const char *str)
9 {
10 printf("in fun2, the str is %s\n", str);
11 }
12
13 int main(int argc, char *argv[])
14 {
15 printf("hello gdb\n");
# (gdb) b main // b 设置断点 :在main函数设置断点,b后面可以接函数名; 等于命令b 15, 可以接行数
Breakpoint 1 at 0x40055e: file one.c, line 15.
# (gdb) info b // info 显示信息 :显示所有的断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040055e in main at one.c:15
# (gdb) r // r 开始执行 : 程序开始执行,直到遇到断点或者执行完成
Starting program: /root/gdb/one
Breakpoint 1, main (argc=1, argv=0x7fffffffe688) at one.c:15
15 printf("hello gdb\n");
# (gdb) n // n 下一步 : 执行该行命令,并显示下一行
hello gdb
17 fun1(argc);
# (gdb) <CR> // 换行 执行上一次的命令 : 再执行一次n
in fun1, the ac is 1
18 int i = 1;
# (gdb) c // 一直执行直到遇到断点
Program exited normally.
并没有进入到fun2,因为没有传递参数,那再来一遍且带参数
# gdb one
# (gdb) b 21 // 直接将断点打到 fun2那里
# (gdb) r 1 2 3 4 // 运行并带参数(1 2 3 4)
Breakpoint 1, main (argc=5, argv=0x7fffffffe668) at one.c:21
21 fun2(argv[i]);
# (gdb) s // 单步执行 : 与n不同的是它会进入函数
fun2 (str=0x7fffffffe8d5 "1") at one.c:10
10 printf("in fun2, the str is %s\n", str);
多个文件中有相同的函数 function_test()
(gdb) b function_test // 所有函数都打断点
(gdb) b a.c:function_test // a.c中的函数断点
以前在windows下开发的时候一直都使用的windows的编辑器(VS), 调试则使用的IDE自带的调试手段,
F9: 设置断点
F5: 执行直到遇到断点
F10: 单步执行
F11: 单步且遇到函数则进入函数
shift+F5: 跳出调试模式
只记录基础的,如果以后再去windows上开发则做补充。
gdb是Linux调试的工具,灰常强大。 关于gdb这个版块不是一次直接写完,先把用的部分写出来一点,以后用到就补充。
2. gdb基础使用
# vi one.c
#include <stdio.h> void fun1(int ac) { printf("in fun1, the ac is %d\n", ac); } void fun2(const char *str) { printf("in fun2, the str is %s\n", str); } int main(int argc, char *argv[]) { printf("hello gdb\n"); fun1(argc); int i = 1; for (; i<argc; i++) { fun2(argv[i]); } return 0; }
# gcc -g -Wall -Werror one.c -o one // 必须要加 -g 选项, 否则不会加载符号表之类的,调试不方便
# gdb one
(gdb) l 10 // list, 列出程序 : 列出后面10行
6 }
7
8 void fun2(const char *str)
9 {
10 printf("in fun2, the str is %s\n", str);
11 }
12
13 int main(int argc, char *argv[])
14 {
15 printf("hello gdb\n");
# (gdb) b main // b 设置断点 :在main函数设置断点,b后面可以接函数名; 等于命令b 15, 可以接行数
Breakpoint 1 at 0x40055e: file one.c, line 15.
# (gdb) info b // info 显示信息 :显示所有的断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040055e in main at one.c:15
# (gdb) r // r 开始执行 : 程序开始执行,直到遇到断点或者执行完成
Starting program: /root/gdb/one
Breakpoint 1, main (argc=1, argv=0x7fffffffe688) at one.c:15
15 printf("hello gdb\n");
# (gdb) n // n 下一步 : 执行该行命令,并显示下一行
hello gdb
17 fun1(argc);
# (gdb) <CR> // 换行 执行上一次的命令 : 再执行一次n
in fun1, the ac is 1
18 int i = 1;
# (gdb) c // 一直执行直到遇到断点
Program exited normally.
并没有进入到fun2,因为没有传递参数,那再来一遍且带参数
# gdb one
# (gdb) b 21 // 直接将断点打到 fun2那里
# (gdb) r 1 2 3 4 // 运行并带参数(1 2 3 4)
Breakpoint 1, main (argc=5, argv=0x7fffffffe668) at one.c:21
21 fun2(argv[i]);
# (gdb) s // 单步执行 : 与n不同的是它会进入函数
fun2 (str=0x7fffffffe8d5 "1") at one.c:10
10 printf("in fun2, the str is %s\n", str);
多个文件中有相同的函数 function_test()
(gdb) b function_test // 所有函数都打断点
(gdb) b a.c:function_test // a.c中的函数断点
相关文章推荐
- 【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装
- CSS Alignment:元素对齐问题
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
- MFC修改菜单
- 【JavaScript】AJax
- 102 Binary Tree Level Order Traversal
- POJ2007--Scrambled Polygon
- c++从零开始学起(关于迭代器的使用)
- hdu 4983 Goffi and GCD(欧拉函数)
- NOIP2010 引水入城
- 求最小的k个数
- 倒排索引
- 8.15总结
- Javascript 基础
- 使用Java快速实现进度条(转)
- Javascript 基础
- leetcode 128: Longest Consecutive Sequence
- Connection reset by peer问题分析
- nyoj448 寻找最大数
- uva 11795 状压dp