c++调试之gdb

1、前提

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,启动gdb调试。

2、启动gdb进入程序

2.1、以gdb启动程序

1、启动命令:gdb

2、进入gdb后,输入命令:'r或run',执行程序

 

2.2、调试正在运行的程序

1、通过命令'ps -ef|grep <进程名>'获取正在运行的进程号pid

2、进入程序通过命令'gdb -p '

 

3、设置断点

3.1、常见设置断点的方式

 用break命令来设置断点。设置断点的方法:

  1、在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数     名:break

   2、在指定行号停住:    break

   3、在当前行号的前面或后面的offset行停住。offiset为自然数:

           break +offset       

           break -offset

  4、在源文件filename的linenum行处停住:    break filename:linenum

  5、 在源文件filename的function函数的入口处停住:    break filename:function

  6、在程序运行的内存地址处停住:    break *address

   7、break命令没有参数时,表示在下一条指令处停住:break

   8、 break ... if

        ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

 

3.2、查看设置的断点信息

    查看断点时,可使用info命令,如下所示:(注:n表示断点号)
    info breakpoints [n]
    info break [n] 

 

4、调试,查看信息

4.1、调试

当程序遇到断点,可以用continue 命令恢复程序的运行直到程序结束,或到下一个断点。

也可以使用step或next命令单步跟踪程序。

4.2、查看信息

4.2.1、查看信息表达式

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p)。print命令的格式是:
   
    print
    print /
        是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。

4.2.2、gdb常见输出格式 

    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。

4.2.2、实例

1、直接查看变量:p x

2、以某浮点数查看变量: p/f x

3、查看数组:  p *array@len

@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中

 

 

 

你可能感兴趣的:(c++,c++)