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)中.你可以用 ...
随机推荐
- CRT 和mysql 中文乱码解决方式
mysql 安装mysql 1. 使用root用户: su root 2. 安装 yum install mysql yum install mysql-server yum install mysq ...
- 2016HUAS_ACM暑假集训3G - 还是畅通工程
最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3 //村庄个数1 2 1 ...
- WIFI基本知识整理
这里对wifi的802.11协议中比较常见的知识做一个基本的总结和整理,便于后续的学习.因为无线网络中涉及术语很多,并且许多协议都是用英文描述,所以有些地方翻译出来会有歧义,这种情况就直接英文来描述了 ...
- .net frameworkAPI文档下载地址
http://www.msdn.hk/html/2014/5.html VS2013 ILdasm 反编译工具安装在下面地址里了 C:\Program Files (x86)\Microsoft SD ...
- (转) Awesome - Most Cited Deep Learning Papers
转自:https://github.com/terryum/awesome-deep-learning-papers Awesome - Most Cited Deep Learning Papers ...
- u-boot-2010.09移植(B)
前面我们的u-boot只是在内存中运行,要想在nandflash中运行,以达到开机自启的目的,还需作如下修改 一.添加DM9000网卡支持 1.修改board/fl2440/fl2440.c中的boa ...
- 本地搭建ubuntu
1 使用VMware Workstation 安装ubuntu 14 2 进入ubuntu 命令行 ctrl+alt+f2 3 默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个 ...
- SOAOffice和iWebOffice、NTKO的比较及其优势(转)
http://www.cnblogs.com/liping13599168/articles/1681465.html SOAOffice和iWebOffice.NTKO的比较及其优势 近年来,市场上 ...
- 开始使用DOJO(翻译)
http://dojotoolkit.org/documentation/tutorials/1.10/start/index.html 我怎么开始学习DOJO?文档在哪?我如何获取支持和培训?我应该 ...
- Log4net按照不同级别写入多个日志文件
[assembly: log4net.Config.XmlConfigurator(Watch = true)]//注入 在一个Web应用项目中,我使用了Fluent NHibernate作为数据访问 ...