• GDB调试一


    http://blog.csdn.net/haoel/article/details/2881

    GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。

    使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的

    全是运行时的内存地址。

    ex:    gcc -c hello.c -o hello

    启动GDB的方法有以下几种:

        1、gdb <program>         program也就是你的执行文件,一般在当然目录下。

        2、gdb <program> core        用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

        3、gdb <program> <PID>        如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

    help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help <class> 命令,如:help breakpoints

    打断点

    break 19     //在第十九行打断点(等同于 b 19)

    b fun        //fun为函数名,可以在进入时设置断点,函数名可以双击tab键补齐

    在gdb中运行linux的shell命令

    shell <command string>

    ex: shell ls /home

    在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。

    1、程序运行参数。    

    set args 可指定运行时参数。(如:set args 10 20 30 40 50)    

    show args 命令可以查看设置好的运行参数。

    2、运行环境。    

    path <dir> 可设定程序的运行路径。    

    show paths 查看程序的运行路径。    

    set environment varname [=value] 设置环境变量。如:set env USER=hchen     show environment [varname] 查看环境变量。

    3、工作目录。     cd <dir> 相当于shell的cd命令。     pwd 显示当前的所在目录。

    4、程序的输入输出。    

    info terminal 显示你程序用到的终端的模式。    

    使用重定向控制程序输出。如:run > outfile     tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb

    调试已运行的程序 ————————

    两种方法:

    1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。

    2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

    暂停 / 恢复程序运行 —————————

    调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

    当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。

    在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。

    一、设置断点(BreakPoint)        

    我们用break命令来设置断点。正面有几点设置断点的方法:        

      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 [n]     info break [n]

    二、设置观察点(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下有用)

    四、维护停止点

    上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。

        clear         清除所有的已定义的停止点。

        clear <function>     clear <filename:function>         清除所有设置在函数上的停止点。

        clear <linenum>     clear <filename:linenum>         清除所有设置在指定行上的停止点。

        delete [breakpoints] [range...]         删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

    比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。

        disable [breakpoints] [range...]         disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.

        enable [breakpoints] [range...]         enable所指定的停止点,breakpoints为停止点号。

        enable [breakpoints] once range...         enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。

        enable [breakpoints] delete range...         enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。

        tcatch <event>         只设置一次捕捉点,当程序停住以后,应点被自动删除。

  • 相关阅读:
    为什么要对url进行encode
    活在当下
    Linux Shell 文本处理工具
    Servlet、Servlet容器等内容讲解
    Java编程中的一些常见问题汇总
    创建文件目录
    ubuntu
    iptables
    mysqldump导入导出
    pt-table-sync
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4476613.html
Copyright © 2020-2023  润新知