zoukankan      html  css  js  c++  java
  • codeblocks基本调试方法—gdb—Debugger

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7257b8c8148228a8448e435061e5a35a3fd7c734e5392d82f0049f4161ffeb56b32610c71eacd9f9f4badebcc757ed16623706dd01642944cfa9c06&p=c3759a45d5c405eb19aac7710f5286&newp=8d769a4786cc41ac5fb4df3d5449c4231610db2151d7d217&user=baidu&fm=sc&query=codeblocks+debugger&qid=b4935ac000005fd7&p1=3

    以一个简单的输出程序为例:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    class point
    {
    public:
    	int a,b,c;
    };
    
    point p;
    
    void fuc()
    {
    	for(int i=1;i<=10;++i)
    	{
    		++p.a;
    		++p.b;
    		++p.c;
    
    		cout<<p.a<<' '<<p.b<<' '<<p.c<<endl;
    	}
    }
    int main()
    {
    	p.a=p.b=p.c=0;
    	fuc();
    
    	cout<<"end."<<endl;
    	return 0;
    }
    运行结果如图:

    调试的时候,可以直接在行号后用鼠标点一下来添加断点(如图:

    之后“菜单-Debug-Start/Continue”(或直接快捷键F8)即可运行到断点处,单步是F7

    以上操作跟VC差不多,接下来是用gdb命令的方法:

    启动调试之后,可以在Debugger选项卡的Command框里输命令(如图:


    一般调试时最常用的是设置断点,查看变量的值,首先

    break funtion
    break line-number
    这两个命令分别是在指定的函数,或者行号处设置断点,例如,对于样例程序:

    break fuc   //在fuc函数处添加断点

    break 20    //在第20行添加断点

    如图:


    在fuc函数处添加断点


    在第20行添加断点

    添加断点之后,可以用命令‘c’来运行到断点处(作用于F8类似),或是用命令‘n’来单步走(类似F7)

    在Command中输入‘c’回车,‘c’回车,来到第20行的断点处


    此时若想要查看变量的值,可以用命令‘p’(printf的简写),例如想查看类p,则用命令‘p p’。如图:


    (输入‘p p’回车


    (即可查看p此时的情况

    如果想去除某个断点的话,可以使用‘clear’命令

    clear func    //清除函数func处的断点
    clear nth     //清除第nth行处的断点

    或是直接‘delete’清除所有断点。

    最后想终止调试的话,直接‘q’回车就可以了。

    附一个搜到的比较全的命令表,来自 http://www.programlife.net/gdb-manual.html

    GDB  命令行参数

    启动 GDB

    l    gdb executable

    l    gdb -e executable -c core-file

    l    gdb executable -pid process-id

    (使用命令 'ps-auxw'  可以查看进程的 pid)

    选项

    含义


    列出命令行参数。

    –exec= file
    -e  file

    指定可执行文件。

    –core= core-file
    -c  core-file

    指明 core 文件。

    –command= file
    -x  file

    从指定文件中读取 gdb 命令。

    –directory= directory
    -d  directory

    把指定目录加入到源文件搜索路径中。

    –cd= directory

    以指定目录作为当前路径来运行 gdb 。


    不要执行 .gdbinit 文件中的命令。默认情况下,这个文件中的命令会在所有命令行参数处理完后被执行。

    –batch

    在非交互模式下运行 gdb 。从文件中读取命令,所以需要 -x 选项。

    –symbols= file
    -s  file

    从指定文件中读取符号表。

    -write

    允许对可执行文件和 core 文件进行写操作。


    不要打印介绍和版权信息。

    –tty= device

    指定  device  为运行程序的标准输入输出。

    –pid= process-id
    -p  process-id

    指定要附属的进程 ID 。

    GDB 命令

    GDB  中使用的命令:

    命令

    描述

    help

    列出 gdb 帮助信息。

    help  topic

    列出相关话题中的 gdb 命令。

    help  command

    列出命令描述信息。

    apropos  search-word

    搜索相关的话题。


    列出运行程序的命令行参数。

    info breakpoints

    列出断点。

    info break

    列出断点号。

    info break  breakpoint-number

    列出指定断点的信息。

    info watchpoints

    列出观察点。

    info registers

    列出使用的寄存器。

    info threads

    列出当前的线程。

    info set

    列出可以设置的选项。

    Break and Watch


    break  funtion
    break  line-number

    在指定的函数,或者行号处设置断点。

    break + offset
    break - offset

    在当前停留的地方前面或后面的几行处设置断点。

    break  file:func

    在指定的 file 文件中的 func 处设置断点。

    break  file:nth

    在指定的 file 文件中的第 nth 行设置断点。

    break * address

    在指定的地址处设置断点。一般在没有源代码时使用。

    break  line-number  if condition

    如果条件满足,在指定位置设置断点。

    break  line  thread thread-number

    在指定的线程中中断。使用info threads可以显示线程号。

    tbreak

    设置临时的断点。中断一次后断点会被删除。

    watch  condition

    当条件满足时设置观察点。

    clear
    clear  func
    clear  nth

    清除函数 func 处的断点。
    清除第 nth 行处的断点。


    删除所有的断点或观察点。

    delete  breakpoint-number
    delete  range

    删除指定的断点,观察点。

    disable  breakpoint-number-or-range
    enable  breakpoint-number-or-range

    不删除断点,仅仅把它设置为无效,或有效。
    例子:
    显示断点: info break
    设置无效: disable 2-9

    enable once breakpoint-number

    设置指定断点有效,当到达断点时置为无效。

    enable del  breakpoint-number

    设置指定断点有效,当到达断点时删除它。

    finish

    继续执行到函数结束。

    Line Execution


    step
    s
    step  number-of-steps-to-perform

    进入下一行代码的执行,会进入函数内部。

    next
    n
    next  number

    执行下一行代码。但不会进入函数内部。

    until
    until  line-number

    until  line-number  if condition

    继续运行直到到达指定行号,或者函数,地址等。

    return
    return  expression

    弹出选中的栈帧(stack frame)。如果后面指定参数,则返回表达式的值。


    执行下一条汇编/CPU指令。

    info signals
    info handle
    handle  SIGNAL-NAMEoption

    当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号)

    where

    显示当前的行号和所处的函数。

    Program Stack


    backtrace
    bt
    bt  inner-function-nesting-depth
    bt - outer-function-nesting-depth

    显示当前堆栈的追踪,当前所在的函数。

    backtrace full

    打印所有局部变量的值。

    frame  number
    number

    选择指定的栈帧。

    up  number
    down  number

    向上或向下移动指定个数的栈帧。

    info frame  addr

    描述选中的栈帧。

    info args
    info all-reg
    info locals
    info catch

    显示选中栈帧的参数,局部变量,异常处理函数。 all-reg 也会列出浮点寄存器。

    Source Code


    list
    l
    list  line-number
    list  function
    list -
    list  start#,end#
    list  filename:function

    列出相应的源代码。

    set listsize  count
    show listsize

    设置 list 命令打印源代码时的行数。

    directory  directory-name
    dir  directory-name
    show directories

    在源代码路径前添加指定的目录。

    directory

    当后面没有参数时,清除源代码目录。

    Examine Variables


    print  variable
    variable
    file::variable
    p ' file ':: variable

    打印指定变量的值。

    p * array-var @ length

    打印 arrary-var 中的前 length 项。

    p/x  var

    以十六进制打印整数变量 var

    p/d  var

    把变量 var 当作有符号整数打印。

    p/u  var

    把变量 var 作为无符号整数打印。

    p/o  var

    把变量 var 作为八进制数打印。

    p/t  var
    x/b  address
    x/b & variable

    以整数二进制的形式打印 var 变量的值。

    p/c  variable

    当字符打印。

    p/f  variable

    以浮点数格式打印变量 var

    p/a  variable

    打印十六进制形式的地址。

    x/w  address
    x/4b & variable

    打印指定的地址,以四字节一组的方式。

    call  expression

    类似于 print ,但不打印 void 。

    disassem  addr

    对指定地址中的指令进行反汇编。

    Controlling GDB


    set  gdb-option value

    设置 GDB 的选项。

    set print array on
    set print array off
    show print array

    以可读形式打印数组。默认是 off 。

    set print array-indexes on
    set print array-indexes off
    show print array-indexes

    打印数组元素的下标。默认是 off 。

    set print pretty on
    set print pretty off
    show print pretty

    格式化打印 C 结构体的输出。

    set print union on
    set print union off
    show print union

    打印 C 中的联合体。默认是 on 。

    set print demangle on
    set print demangle off
    show print demangle

    控制 C++ 中名字的打印。默认是 on 。

    Working Files



    列出当前的文件,共享库。

    file  file

    file 当作调试的程序。如果没指定参数,丢弃。

    core  file

    file 当作 core 文件。如果没指定参数,则丢弃。

    exec  file

    file 当作执行程序。如果没指定参数,则丢弃。

    symbol  file

    file 中读取符号表。如果没指定参数,则丢弃。

    load  file

    动态链入 file 文件,并读取它的符号表。

    path  directory

    把目录 directory 加入到搜索可执行文件和符号文件的路径中。

    Start and Stop


    run
    r
    run  command-line-arguments
    run <  infile  >  outfile

    从头开始执行程序,也允许进行重定向。


    继续执行直到下一个断点或观察点。

    continue  number

    继续执行,但会忽略当前的断点 number 次。当断点在循环中时非常有用。

    kill

    停止程序执行。


    退出 GDB 调试器。

    GDB  操作提示

    l    在编译可执行文件时需要给 gcc  加上 "-g" 选项,这样它才会为生成的可执行文件加入额外的调试信息。

    l    不要使用编译器的优化选项,比如: "-O" ,"-O2"。因为编译器会为了优化而改变程序流程,那样不利于调试。

    l    在 GDB  中执行 shell 命令可以使用:shell command

    l    GDB  命令可以使用 TAB  键来补全。按两次 TAB 键可以看到所有可能的匹配。

    l    GDB  命令缩写:例如 info bre  中的 bre 相当于 breakpoints。

    GDB  在 Emacs  中的操作:

    emacs 按键

    动作

    M-x gdb

    切换到 gdb 模式。

    C-h m

    显示 gdb 模式介绍信息。

    M-s

    等同于gdb 中的 step 命令。

    M-n

    等同于gdb 中的 next 命令。

    M-i

    等同于gdb 中的 stepi 命令。

    C-c C-f

    等同于gdb 中的 finish 命令。

    M-c

    等同于gdb 中的 continue 命令。

    M-u

    等同于gdb 中的 up 命令。

    M-d

    等同于gdb 中的 down 命令。


    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(329) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Office 2016 安装你所必须要注意的事项
    JetBrains软件开发框架下的类似于“.IntelliJIdea2018.1”的配置文件夹的移动
    “microsoft ace oledb 12.0 未注册”疑云
    WebStorm添加多个项目到当前工程目录
    SVN入门教程
    FreeMarker 快速入门
    ajax详解
    基于JavaMail的Java邮件发送:简单邮件发送
    css 文件上传按钮美化
    chrome开发者工具的使用
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648957.html
Copyright © 2011-2022 走看看