gdb 调试程序
要调试生成的可执行程序,必须在生成的时候加入-g选项,生成可以调试的代码
例如:gcc -o test a.c b.c -g
这样gcc就会在链接的时候加入一些用于调试的符号
在生成可以调试的可执行程序后,使用gdb命令进入调试模式
root@ubuntu:/home/leo/test/project/classes# gdb test
GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10
Copyright (C) Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 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 test...done.
(gdb)
此时,程序并没有开始运行,在运行程序之前,可以做一些准备工作
1. 设置运行参数
(gdb) set args 5 设置第一个参数为5
(gdb) show args 
Argument list to give program being debugged when it is started is "5".
2. 设置断点,break命令,简写b
在指定行数设置断点
(gdb) b 8 在第8行设置断点
Breakpoint at 0x4004f0: file main.cpp, line .
(gdb)
为指定函数设置断点
(gdb) b add_int
Breakpoint at 0x400660: file math/add_int.cpp, line .
在指定行数或函数设置条件变量
(gdb) b add_int if num1 ==
Breakpoint at 0x400660: file math/add_int.cpp, line .
查看断点
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x0000000000400660 in add_int(int, int)
at math/add_int.cpp:
stop only if num1 ==
breakpoint already hit time
禁用断点 disable b 4,禁用4号断点
启动断点 enable b 4,启用4号断点
删除断点 clear 51 删除51行的断点
3. 查看源文件,list命令,简写l
(gdb) list
#include "stdlib.h"
#include "stdio.h" int add_int(int, int);
float add_float(float, float); int main(int argc, char *argv[])
{
int value = (*argv[]) - '';
printf("Leo is here %d . \n", value);
(gdb) list int num1 = add_int(, );
float num2 = add_float(2.3, 4.5);
printf("result is %d %f.", num1, num2); getchar(); return ;
}
(gdb) list
Line number out of range; main.cpp has lines.
(gdb)
也可以指定查看的行数list 5,,10,查看从5到10行的源代码
做好准备工作之后,就可以真正运行程序了
4. 运行程序,run命令,简写r
(gdb) b
Breakpoint at 0x4004f0: file main.cpp, line .
(gdb) run 5 可以直接在run后面可以跟运行参数,也可以用set设置运行参数
Starting program: /home/leo/test/project/classes/test Breakpoint , main (argc=, argv=0x7fffffffe018) at main.cpp:
{
(gdb)
5. 查看变量,display命令。在使用断点命令后,在运行到断点处,就可以使用此命令查看变量得值了
(gdb) b
Breakpoint at 0x4004f0: file main.cpp, line .
(gdb) run
Starting program: /home/leo/test/project/classes/test Breakpoint , main (argc=, argv=0x7fffffffe018) at main.cpp:
{
(gdb) display argc 查看运行参数个数
: argc =
(gdb) display argv[] 查看第一个运行参数的值
: argv[] = 0x7fffffffe38b ""
(gdb)
6. 继续执行,continue命令,简写c
(gdb) b
Breakpoint at 0x4004f0: file main.cpp, line .
(gdb) run
Starting program: /home/leo/test/project/classes/test Breakpoint , main (argc=, argv=0x7fffffffe018) at main.cpp:
{
(gdb) c
Continuing.
Leo is here .
result is 6.800000.
[Inferior 1 (process 4009) exited normally]
7. 修改变量的值,set命令
(gdb) b
Breakpoint at 0x4004f0: file main.cpp, line .
(gdb) run
Starting program: /home/leo/test/project/classes/test Breakpoint , main (argc=, argv=0x7fffffffe018) at main.cpp:
{
(gdb) display argv[]
: argv[] = 0x7fffffffe38b ""
(gdb) set argv[] = "" 将第一个运行参数的值从字符串“7”改为“8”
(gdb) c
Continuing.
Leo is here .
result is 6.800000.
[Inferior 1 (process 4009) exited normally]
8. 退出调试,q命令
(gdb) q
A debugging session is active. Inferior [process ] will be killed. Quit anyway? (y or n) y
9. 查看变量类型,whatis命令
(gdb) whatis num1
type = int
(gdb)
10. 查看结构详细定义,ptype命令
(gdb) ptype u
type = struct User {
int id
char name[]
}
10. 进入函数体(step,简写s)和单步调试命令(next,简写n)
(gdb) s
}: num2 =
: num1 =
(gdb) n
main (argc=<optimized out>, argv=<optimized out>) at main.cpp:
float num2 = add_float(2.3, 4.5);
(gdb)
11. 查看调用堆栈(backtrace,简写bt)
(gdb) bt
# add_int (num1=num1@entry=, num2=num2@entry=) at math/add_int.cpp:
# 0x000000000040051b in main (argc=<optimized out>, argv=<optimized out>)
at main.cpp:
(gdb)
12. 获取当前断点下的运行情况(info)
13. 多线程调试
info thread: 获取当前进程中所有线程信息;
thread thread_id: 进入指定的线程进行调试;
14. 打印指定函数的汇编代码
disassamble sum
15. 帮助信息
help
gdb 调试程序的更多相关文章
- 用GDB调试程序(一)
		http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ... 
- Linux下使用GDB调试程序
		问题描述: Linux下使用GDB调试程序 问题解决: (1)生成调试文件 注: 使用命令 gdb IOStream.c -o IOStre ... 
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
		用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5 ... 
- 用GDB调试程序
		转自:http://blog.csdn.net/haoel/article/details/2879 是一篇从基础讲gdb的博文 用GDB调试程序 GDB概述---- GDB是GNU开源组织发布的一个 ... 
- gdb调试程序函数名为问号,什么原因?step by step解决方案
		gdb调试程序函数名为问号,什么原因? http://bbs.chinaunix.net/thread-1823649-1-1.html http://www.bubuko.com/infodetai ... 
- 用gdb调试程序(Linux环境)
		一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) ... 
- [Z] 用GDB调试程序
		原文:http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工 ... 
- 用 GDB 调试程序
		Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ... 
- 转载  gdb调试程序
		转载自csdn,作者haoel,链接http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一 ... 
- Linux高级编程--04.GDB调试程序(查看数据)
		查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ... 
随机推荐
- JS的字符串处理
			1.字符串包含判断 var a = "qwer"; var b = "q"; if (a.contains(b)) { alert("1") ... 
- 获取应用程序信息.h
			//// 获取应用程序信息.h// IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ... 
- 存储过程procedure
			存储过程(procedure) 修改mysql结束符 delimiter name procedure创建语法: create procedure p ... 
- Apache Shiro 简单概念
			Apache Shiro 是ASF旗下的一款开源软件(Shiro发音为"shee-roh",日语"堡垒(Castle)"的意思),提供了一个强大而灵活的安全框架 ... 
- SQL分页查询
			假如tb_customer表中的数据量非常大,在显示时要分页显示而且每页只显示10条信息.为了效果我们取第三页的数据. 方法一:遍历两次表,取不同的数据. select top 10 * from t ... 
- LSOF 安装与使用
			linux上安装: tar zxvf lsof_4.76.tar.gz cd lsof_4.76 ls 00.README.FIRST_4.76 lsof_4.76_src.tar.gz README ... 
- TensorFlow中与卷积核有关的各参数的意义
			以自带models中mnist的convolutional.py为例: 1.filter要与输入数据类型相同(float32或float64),四个参数为`[filter_height, filter ... 
- Disconf
			通常我们会做如下配置:(disconf 2.6.21) <!-- 一次扫描 --> <bean id="disconfMgrBean" class="c ... 
- ADXL3xx: 读取 ADXL3xx 加速度传感器
			原文链接:https://www.arduino.cc/en/Tutorial/ADXL3xx ADXL3xx加速度传感器 本教程将为你展示如何读取Analog Devices的ADXL3xx系列加速 ... 
- elastalert SpikeRule异常告警问题
			公司里面用了ELK,所以也就顺其自然的玩起了elastalert, 发现SpikeRule比较符合自己的需求. 但配置后,死活不停的虚假告警,看实际曲线明明没有相差太多,1.4的倍率却总是被打破. 憋 ... 
