要调试生成的可执行程序,必须在生成的时候加入-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 调试程序的更多相关文章

  1. 用GDB调试程序(一)

    http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ...

  2. Linux下使用GDB调试程序

    问题描述:          Linux下使用GDB调试程序 问题解决:          (1)生成调试文件 注:         使用命令   gdb IOStream.c   -o IOStre ...

  3. 用gdb调试程序笔记: 以段错误(Segmental fault)为例

    用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5 ...

  4. 用GDB调试程序

    转自:http://blog.csdn.net/haoel/article/details/2879 是一篇从基础讲gdb的博文 用GDB调试程序 GDB概述---- GDB是GNU开源组织发布的一个 ...

  5. gdb调试程序函数名为问号,什么原因?step by step解决方案

    gdb调试程序函数名为问号,什么原因? http://bbs.chinaunix.net/thread-1823649-1-1.html http://www.bubuko.com/infodetai ...

  6. 用gdb调试程序(Linux环境)

    一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)   ...

  7. [Z] 用GDB调试程序

    原文:http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工 ...

  8. 用 GDB 调试程序

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ...

  9. 转载 gdb调试程序

    转载自csdn,作者haoel,链接http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一 ...

  10. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

随机推荐

  1. 关于CSS初步入门简述1

    关于CSS的简介可以自行百度,本篇只考虑内容 首先关于CSS会由浅入深,写在前面的有很多不严谨,只是为了引出后文所写.不过如果谬误较大,敬请指正! 1.大部分的代码要写在之中 简单的例子: <b ...

  2. URL Scheme APP跳转safari以及跳回APP

    上图 : 在plist文件里面设置. URL identifier 一般为反域名+项目名称 (尽可能保证少重复) URL Schemes是一个数组.一个APP可以添加多个.该参数为跳转时使用的标识. ...

  3. jsp中查询条件的回显

    后台框架为ssh,前台纯手写无框架是最老的写法,因为是接手别人的项目无法改变框架原型,只能基于修改. 进入正题: 我这里查询条件有两种input的text(文本框)和select(下拉框). 1.te ...

  4. [转]windows下编译及使用libevent

    http://www.cnblogs.com/luxiaoxun/p/3603399.html Libevent官网:http://libevent.org/ windows 7下编译: 编译环境:  ...

  5. 解决在VS2015下用C++开发的DLL在WIN7上无法加载运行

    首先用Dependency Walker检查该DLL依赖的库,如下图所示: 依赖的动态库除了KERNEL32.DLL.USER32.DLL外,还包括了MSVCP120D.DLL以及MSVCR120D. ...

  6. android的一些关键词

  7. 如何使用openssl生成RSA公钥和私钥对

      在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互 ...

  8. js预解析及特效

    预解析: // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var ...

  9. JS常用工具函数

    /** * Created by gaojun-pd on 2016/10/27. */ var Util = { /** * 1.判断非空 * 2.获取字符串真实长度 汉字算两位 * 3.判断参数类 ...

  10. Unity代码设置shader属性

    主要是用到了Material.SetTexture这个方法,具体可以参考如下: 举个例子,比如我想用代码动态控制Skybox/Cubemap下的Cubemap,可以这样写: public Cubema ...