您的位置:首页 > 其它

GDB部分知识整理

2016-03-29 16:17 225 查看
GDB调试从基础到精通实例

地址:http://www.cnblogs.com/azraelly/archive/2012/12/22/2829256.html

GDB主要功能:

1 启动程序,并且按照特定的要求运行程序;

2 可让被调用的程序在指定的断点位置停住,断点可以是条件表达式;

3 当程序被停止时,可以检查此时程序所发生的事情;

4 动态的改变程序的执行环境;

GDB一般用于调试C/C++程序;

GDB如果希望调试程序那么在编译的时候需要加上 -g 参数才可以调试,如果没有 -g 那么调试信息将显示运行时的内存地址,

将不能看到程序的函数名、变量名等信息;

如:
cc -g hello.c -o hello 
g++ -g hello.cpp -o hello

启动GDB的方法:
1 gdb <执行文件> 
2 gdb <执行文件> core //gdb调试一个运行程序和core文件,core文件是程序非法执行后coreDump产生的文件
3 gdb <执行文件> <PID> //如果程序是一个服务程序,那么可以指定程序的进程ID,gdb会自动attach上去,并调试。 

执行文件应该在PATH(环境变量)中搜索得到。

GDB基本调试方法:
运行程序:GDB 执行文件;如gdb hello
查看代码:list(简写 l)
设置断点:break Number(简写 b)(在Number行设置一个断点)
设置断点:break function(在函数上设置一个断点)
显示所有断点:info break
执行程序:run(简写 r)
=====》》》》程序在断点处停止
继续执行一行程序:next (简写 n)
跳过当前断点继续执行后面的代码:continue (简写 c),跳过当前断点则会直接运行到下一个断点处并输出下一个断点的位置及代码
输出某个变量的值:print 变量(简写 p)(inspect也是此功能); 如果:printf i 或者 p i 
查看当前的堆栈信息:bt
退出函数:finish
退出gdb:quit(简写 q)
如果某个命令记不全则只需要觉得最前面的字母,然后两次tab键,则会弹出所有前面几个字母系统的关键字。函数、变量也是同样道理

GDB调试正在运行的程序方法:

方法1:
1 ps -ef | grep 查看运行程序的进程ID
2 gdb 运行程序的执行文件 进程ID 这样就可以挂起挂起正在运行的程序

方法2:
先用gdb <运行程序的执行文件>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

GDB 中暂停程序的方法:
1 断点 (BreakPoint)
2 观察点 (WatchPoint)
3 捕捉点 (CatchPoint)
4 信号 (Signals)
5 线程停止 (Thread Stops)

下面是设置断点,观察点,捕获点的一些方法:

一、设置断点(BreakPoint)

    break <function> 

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

    break <linenum>

        在指定行号停住。

    break +offset 

    break -offset 

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

    break filename:linenum 

        在源文件filename的linenum行处停住。

    break filename:function 

        在源文件filename的function函数的入口处停住。

    break *address

        在程序运行的内存地址处停住。

    break 

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

    break ... if <condition>

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

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

    info breakpoints
 

    info break
 

二、设置观察点(WatchPoint)   

    观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点: 

    watch <expr>

        为表达式(变量)expr设置一个观察点。只要表达式值有变化时,马上停住程序。 

    rwatch <expr>

        当表达式(变量)expr被读时,停住程序。 

    awatch <expr>

        当表达式(变量)的值被读或被写时,停住程序。

    info watchpoints

        列出当前所设置了的所有观察点。

三、设置捕捉点(CatchPoint)

    你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:

    catch <event>

        当event发生时,停住程序。event可以是下面的内容:

        1、throw 一个C++抛出的异常。(throw为关键字)

        2、catch 一个C++捕捉到的异常。(catch为关键字)

        3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)

        4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)

        5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)

        6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)

        7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

    tcatch <event> 

        只设置一次捕捉点,当程序停住以后,该点被自动删除。

GDB中可以随时查看以下三种的变量:
1 全局变量(所有文件可见)
2 静态全局变量(当前文件可见)
3 局部变量(当前scope可见,如果局部变量和全局变量重名,则在scope中将会隐藏全局变量只显示局部变量)

以上是GDB的部分整理情况,算不上怎样的真理,但是这样结果自己简单的处理还是能够得到不少东西的。以后会有属于自己的GDB文章的,现在的还请见谅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Ubuntu gdb调试