燕青专栏

读书笔记及技术探讨

转载 使用gdb调试程序简介收藏

使用gdb调试程序简介       源自:CaoJing (个人网站)

一、初始化
    输入gdb进入gdb调试环境。或者直接输入gdb + progfile来加载文件。
注意该文件是使用gcc(或g++)编译得到的。为了使 gdb 正常工作, 必须
使你的程序在编译时包含调试信息,编译时必须使用-g参数来。
    或者进入gdb环境后,通过命令file + progfile来加载需要调试的可
执行文件文件。

    查看源代码:list [函数名][行数]
   
    设置程序运行参数:set args
   
二、暂停程序   
    gdb可以使用几种方式来暂停程序:断点,观察点,捕捉点,信号,线
程停止。当程序被暂停后,可以使用continue、next、setp来继续执行程序。
 continue 执行到下一暂停点或程序结束。
 next         执行一行源代码但不进入函数内部。
 setp        执行一行源代码而且进入函数内部。

    1、设置断点:
       a、break + [源代码行号][源代码函数名][内存地址]
       b、break ... if condition   ...可以是上述任一参数,condition
    条件。例如在循环体中可以设置break ... if i = 100 来设置循环次数。
 
    2、设置观察点:
       a、watch + [变量][表达式]  当变量或表达式值改变时即停住程序。
       b、rwatch + [变量][表达式] 当变量或表达式被读时,停住程序。
       c、awatch + [变量][表达式] 当变量或表达式被读或被写时,停住程序。

    3、设置捕捉点:
       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 载入共享库(动态链接库)时。(load为关键字,
            目前此功能只在HP-UX下有用)
 7)、unload 或 unload 卸载共享库(动态链接库)时。(unload为关
            键字,目前此功能只在HP-UX下有用)

    4、捕捉信号:
       handle + [argu] + signals
       signals:是Linux/Unix定义的信号,SIGINT表示中断字符信号,也就是
       Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改
       变信号; SIGKILL表示终止程序运行的信号,等等。
       argu:
   nostop   当被调试的程序收到信号时,GDB不会停住程序的运行,但
                   会打出消息告诉你收到这种信号。
   stop     当被调试的程序收到信号时,GDB会停住你的程序。
   print    当被调试的程序收到信号时,GDB会显示出一条信息。
   noprint  当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
   pass or noignore    当被调试的程序收到信号时,GDB不处理信号。
                   这表示,GDB会把这个信号交给被调试程序会处理。
  nopass or ignore     当被调试的程序收到信号时,GDB不会让被调
                   试程序来处理这个信号。

     5、线程中断:
        break [linespec] thread [threadno] [if ...]
        linespec 断点设置所在的源代码的行号。如: test.c:12表示文件为
                 test.c中的第12行设置一个断点。
        threadno 线程的ID。是GDB分配的,通过输入info threads来查看正在
                 运行中程序的线程信息。
        if ...   设置中断条件。


三、查看信息
     1、查看数据
        print  variable        查看变量
        print  *array@len      查看数组(array是数组指针,len是需要数据长度)
        可以通过添加参数来设置输出格式:
            /x 按十六进制格式显示变量。
            /d 按十进制格式显示变量。
            /u 按十六进制格式显示无符号整型。
            /o 按八进制格式显示变量。
            /t 按二进制格式显示变量。
            /a 按十六进制格式显示变量。
            /c 按字符格式显示变量。
            /f 按浮点数格式显示变量。

      2、查看内存
         examine /n f u + 内存地址(指针变量)
         n 表示显示内存长度
         f 表示输出格式(见上)
         u 表示字节数制定(b 单字节;h 双字节;w 四字节;g 八字节;默认为四字节)
  如:
             x /10cw pFilePath  (pFilePath为一个字符串指针,指针占4字节)
             x 为examine命令的简写。

      3、查看栈信息      
  backtrace [-n][n]
         n  表示只打印栈顶上n层的栈信息。
        -n 表示只打印栈底上n层的栈信息。
         不加参数,表示打印所有栈信息。


附注:
基本gdb命令:
---------------------------------------------------------------------
命令          简写         功能
---------------------------------------------------------------------
file                             装入想要调试的可执行文件.
kill             k              终止正在调试的程序.
list             l               列出产生执行文件的源代码的一部分.
next           n              执行一行源代码但不进入函数内部.
step          s              执行一行源代码而且进入函数内部.
continue  c               继续执行程序,直至下一中断或者程序结束。
run            r               执行当前被调试的程序.
quit           q               终止 gdb.
watch                        使你能监视一个变量的值而不管它何时被改变.
catch                         设置捕捉点.
thread       t               查看当前运行程序的线程信息.
break        b              在代码里设置断点, 这将使程序执行到这里时被挂起.
make                        使你能不退出 gdb 就可以重新产生可执行文件.
shell                         使你能不离开 gdb 就执行 UNIX shell 命令. 
print          p              打印数据内容。
examine  x               打印内存内容。
backtrace bt             查看函数调用栈的所有信息。 

发表于 @ 2006年08月15日 09:48:00|评论(loading...)

新一篇: 使用profile来得到程序运行信息 | 旧一篇: 在linux下如何获取从系统booting时到现在所流失的时间ticks

用户操作
[即时聊天] [发私信] [加为好友]
燕青
订阅我的博客
XML聚合  FeedSky
文章分类
收藏
    c/c++优秀网站
    boost
    c/c++ Reference
    C99标准
    Effective STL 中文版
    stlport
    stlsgi
    编程爱好者
    eBook
    rinet
    Excel/VBA
    VBA参考手册
    VBA自由代码库
    Linux GNU
    GNU Libs HOWTO
    Linux GUI
    QT中文论坛
    MICOM
    AVR MICRO
    WinAVR Tutorial
    MSND
    MSDN在线帮助
    web聊天网
    查看MSN联系人状态
    ebuddy
    iloveim
    imhaha
    meebo
    meebo11
    Web MSN
    米博
    澳洲移民
    前程专业留学移民公司
    百科全书
    QWika
    vesa标准
    wikipedia
    电子元器件网站
    eeworld
    好友链接
    Anders New Blog
    Anders的博客
    Anders的网站
    全胜花的生命痕迹
    小葛的博客
    尧的快乐一家
    捷仔的博客
    老郭的博客
    老钱的博客
    金种子母婴生活馆
    阿耀的博客
    家用网站
    上海移动通信
    中国电信网上营业厅
    金融网站
    纳斯达克
    开源网站
    apache
    opensource
    SVN
    垮平台GUI
    microwindows
    wxWidgets
    敏捷编程
    agilejournal
    extremeprogramming
    jayasoft
    maven
    上海四金网
    上海住房公积金网
    上海养老保险网
    上海医保网
    万年历
    21page万年历
    百渡万年历
    网页脚本教程
    DynamicDrive
    PageSource
    网站交换
    刘韧交换链接网站
    英语听力
    VOA慢速英语
    海词字典
    英语中级听力
    语高级听力
    优秀UNIX/LINUX网站
    IBM Linux论坛
    opengroup
    perl
    pthread
    socket
    UNIX Specification
    unix标准大全
    永远的UNIX
    存档
    Csdn Blog version 3.1a
    Copyright © 燕青