GDB调试器

摘要:
/*intstrcmp;char*fgets;//将数据从文件流发送到缓冲区。文件*fp=fopen;*//*补充:对于包含命令行参数的程序的调试,rarg1arg2arg3…使可执行程序能够最大限度地保留调试信息:gcc-ggdb3-o<test><test c>-Wall gstabs关闭编译和优化gdb帮助:hhelpallhelp<commandclass>Help<command>apropos<word>搜索相关单词。编译时,添加-g并将源文件信息添加到可执行文件!!!

/*this project used for gdb debug c programs*/
/*At first,using compile command turn out the executable file. exp: gcc -g sourcefile.c -o test.exe */        //!!!
/*windows: start gdb debuging(test.exe complete trace) : gdb test.exe */
/*Linux: start gdb debuging(current trace) : gdb ./test  */                    //!!!
/*
    int strcmp(const char *s1,const char *s2);
    char *fgets(char *buf,int n,FILE *fp);  //send data read from file stream to buffer.
        FILE *fp = fopen(argv[1],"r");
*/
/*

补充:

  对含有命令行参数的程序的调试

  (gdb) r arg1 arg2 arg3 …

  


    使可执行程序最大限度的保留调试信息:
        gcc -ggdb3 -o <test> <test.c>
              -Wall
            -gstabs  关闭编译优化

    gdb帮助:    

           (gdb) h
                (gdb) help all
                (gdb) help <command class>
                (gdb) help <command>
                (gdb) apropos <word>    搜索相关word的命令


    编译时注意加上-g,在可执行文件中加入源文件信息(提供我们以后对程序进行调试的信息)        !!!
                -o,要求输出可执行文件文件
                -c,表示我们只要求编译器输出目标代码,而不必输出可执行文件

    调试过程
    1.设置断点           (gdb) b 行号  //可以设置多个断点
                    (gdb) b(reak) <funcname>
      查看断点           (gdb) info b
      禁用断点           (gdb) disable b 断点号
      再次激活断点     (gdb) enable breakpoints 断点号
      删除断点           (gdb) delete breakpoints 断点号
      清除断点        (gdb) clear 断点所在行号
      设置条件断点    (gdb) condition 1 <svalues[counter]->chechsum>700>
      临时断点        (gdb) tbreak <41>
    2.使用gdb单步调试程序  
                     (gdb) r          //在断点处停下
                     (gdb) n          //单步运行,不进入函数内部
                     (gdb) s(tep)     //一次一行
                     (gdb) c           //停止单步调试,继续执行直至断点或者输入
                     (gdb) cont <n>     //执行n次continue
                     (gdb) finish     //退出函数
    3.跟踪程序变量
                    (gdb) p buffer         //打印buffer的值
                    (gdb) p strlen(buffer)-1
                    (gdb) p $ (n)        //打印当前序号(或序号n)的前一序号变量的值
                    (gdb) p $$ (n)        //打印序号n-2的变量的值
      使用print给变量赋值
                      (gdb) p 变量=表达式
      打印内存某个部分开始的一块连续空间的内容
                      (gdb) p 开始表达式@要打印的空间大小  例:(gdb) p *array@len

      显示各种变量的值以及内存地址
                    (gdb) p pStr[0]
                    (gdb) p *(pStr[0]+1)
                    (gdb) p &pStr[0]
      printf查看变量
                      (gdb) printf "%2.2s ",(char*)<addr>
      set修改变量的值
                      (gdb) set variable svalues[0]->checksum=2000

    4.自动显示指定变量的值
                    (gdb) display pStr_index
                    (gdb) display/<fmt> <expr>
                    (gdb) display/<fmt> <addr>
                    (gdb) info display
                    (gdb) disable d 2
                    (gdb) enable display 2
                    (gdb) delete diaplay 2

    5。查看函数堆栈            //程序调用一个函数时,函数的地址/参数/局部变量都会被压入栈中
                    (gdb) bt (backtrace)    //打印当前的函数调用栈的所有信息
                    (gdb) bt <n>             //打印前n层的栈顶信息
                    (gdb) bt <-n>             //打印栈底的前n层信息
                    (gdb) f(rame) <n>            //查看栈上某层信息(栈的层编号,当前函数名,函数参数值,函数所在文件及行号) frame 0 栈顶
                    (gdb) up <n>
                    (gdb) down <n>
                    (gdb) select-frame <n>     //对应frame,但是不输出栈层信息
                    (gdb) up-silently <n>
                    (gdb) down-silently <n>
                    (gdb) info f(rame)         //显示更为详细的当前栈层的信息
                    (gdb) info args            //显示当前函数的参数名及值
                    (gdb) info locals          //显示当前函数中所有局部变量及值
                    (gdb) info catch         //显示当前函数中的异常处理信息
                    
    6.                 (gdb) make
                    (gdb) shell
                    (gdb) q   //退出gdb调试
    7.代码显示
                    (gdb) where                 //查找错误位置
                    (gdb) l(ist) <n>            //查看当前行后面的代码<显示第n行附近的代码>
                    (gdb) l(ist) -                //查看当前行前面的代码
                    (gdb) l     <function>        //显示函数的源程序
                    (gdb) l     test.c:9         //查看test.c第九行代码
                    (gdb) set     listsize <count>    //设置显示行数
                    (gdb) show     listsize            //查看当前设置的显示的行数
                    (gdb) l     <first> <last>        //显示从first行到last行的源代码
                    (gdb) l     , <last>            //显示从当前行到last行的源代码
                    (gdb) l     +                    //向后显示代码
                    (gdb) forward-search <regexp>    //向前搜索,regexp是正则表达式
                    (gdb) reverse-search <regexp>    //全部搜索

    8.查看内存命令(x命令)
                    (gdb) x/<n/f/u> <addr>  //n、f、u是可选的参数 详见:(gdb) help x
                        u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
                        f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
                        n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。
                        例:命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。


    9.使用观察窗口
                    (gdb) watch <counter>15>  //满足条件后程序运行终止

    10.指定源文件的路径
                    dir <dirname>            //多个路径使用:(UNIX ) ;(WINDOW)
                    directory                //清除所有的自定义的源文件搜索路径信息
                    show directory             //显示定义了的源文件搜索路径

 11.查看运行时数据
        (gdb) print <expr>
        (gdb) print /<f>     <expr>    //  <f> 输出格式 <expr> 表达式
                    x        @        //与数组有关
                    d        ::        //指定一个在文件或一个函数中的变量
                    u        {<type>} <addr>        //表示一个指向内存地址<addr>的类型为type的一个对象
                    o
                    t
                    a
                    c
                    f

        (gdb) print file::variable            //查看文件中的全局变量
        (gdb) print function::variable        //查看函数中的局部变量 例: (gdb) p 'f2.c'::x
    
    12.设置显示选项   
        (gdb) set print address
        (gdb) set print address on          //打开函数地址参数显示
        (gdb) f                             //显示栈信息
        (gdb) set print address off         //关闭函数地址参数显示
        (gdb) show print address

        (gdb) set print array                 
        (gdb) set print array on            //打开数组显示
        (gdb) show print array

        (gdb) set print elements <num-of-elements>     //对大数组,显示部分长度
        (gdb) show print elements             //查看print elements的选项信息

        (gdb) set print null-stop <on/off>  //当显示字符串时,遇到结束符则停止显示。选项默认为off.

        (gdb) set print pretty on             //结构体完美显示
        (gdb) set print pretty off
        (gdb) show print pretty             //查看gdb如何显示结构体

        (gdb) set print sevenbit-strings <on/off>    //设置字符显示是否按照 nn的格式显示
        (gdb) show print sevenbit-strings            //查看字符显示开关是否打开
        (gdb) set print union <on/off>                 //设置显示结构体时,是否显示内部的联合体结构
        (gdb) show print union

        (gdb) set print object <on/off>             //当一个对象指针指向其派生类时,如果打开这个选项,gdb自动按照虚方法调用的规则显示输出,关闭后,gdb就不管虚函数表了。默认为off
        (gdb) show print object

        (gdb) set print static-members <on/off>      //显示C++对象的静态数据成员。默认是on
        (gdb) show print static-members                

        (gdb) set print ytbl <on/off>                //使用规整的格式显示虚拟函数表。默认是关闭的
        (gdb) show print vtbl                        //查看虚函数显示格式的选项

    13.gdb环境变量
        可以在gdb的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。
        (gdb) set $foo=*object_ptr
        (gdb) show convenience                 //查看当前所设置的所有的环境变量
        


    14.查看寄存器
        (gdb) info registers
        (gdb) info all-registers
        (gdb) info registers <regname>         //查看指定寄存器的情况
        (gdb) p $<regname>                    //打印寄存器的内容


    15.改变程序的执行
        修改变量的值
        (gdb) p x=4
        (gdb) whatis width                    //gdb中的参数width与程序中的变量width重名的话,使用var指定为程序的 变量名
        (gdb) p width        
        (gdb) set var width=47                

        跳转执行(最好在同一个函数中跳转)
        jump命令的实质是改变了pc寄存器的值 set $pc= 0x...
        (gdb) jump <linespec>                //<linespec>可以是行号/file:line/+num
        (gdb) jump <address>                //代码行的内存地址

        产生信号量
        (gdb) signal <signal>                //linux的系统信号量通常是1到15

        强制函数返回(详见《Linux环境下C编程指南》P(82+12))

        强制调用函数


    16.在不同语言中使用gdb
        以下命令主要用于C以外的程序语言
        (gdb) show language             //查看当前语言环境
        (gdb) info frame                 //查看当前函数的程序语言
        (gdb) info source                 //查看当前文件的程序语言
        (gdb) set language <languagename>


    17.core dump分析
        程序崩溃原因分析
        $ulimit -c unlimited             //获得core dump使用权限

    $ gcc -ggdb3 ...

    $ ./a.out

    $ gdb a.out core

case12:

	typedef enum (Tree,Bug) Species;
	typedef enum (Big_tree, Acorn, Seedling) Tree_forms;
	typedef enum (Caterpillar, Cocoon, Butterfly) Bug_forms;
	struct thing 
	{
		Species it;
		union
		{
			Tree_forms tree;
			Bug_forms bug;
		}form;
	};
	
	struct thing foo = {Tree, {Acorn}}
	
	(gdb) set print union on
	(gdb) p foo
	$1={it=Tree, form={tree=Acorn, bug=Cocoon}}
	(gdb) set print union off
	(gdb) p foo
	$1={it=Tree, form={...}}

 case13:

        (gdb) set $i=0
	(gdb) print bar[$i++]->contents     

免责声明:文章转载自《GDB调试器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS—静态方法(类方法)和实例方法Linux 基础教程 39-作业控制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何用java实现两个变量值的互换!

1、通过第三方变量实现两个变量的交换:          2、通过已有的两个变量之间的加或减实现:          这种方法对于两个都是无限接进int取值范围,而相加超出int取值范围的情况不适用。 3. 指针地址操作因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即...

ueditor解决超链接、预览无效问题

最近在某项目中引用了ueditor,并没有注意到除了文本编辑与上传图片以外的功能是否完好。后面测试提了俩bug,发现超链接与预览无效的问题,业务需求确实需要这俩功能,还是得解决。 在点击超链接或预览按钮的时候,发现控制台报错:Uncaught ReferenceError: editor is not undefined at link.html,大致就是...

spark教程(14)-共享变量

spark 使用的架构是无共享的,数据分布在不同节点,每个节点有独立的 CPU、内存,不存在全局的内存使得变量能够共享,驱动程序和任务之间通过消息共享数据 举例来说,如果一个 RDD 操作使用了驱动程序中的变量,spark 会将这个变量的副本和 task 一起发送给 executor 中的执行者,对该变量的更新只存在于 task 的内部,并不会回传给驱动程...

Vue使用指南(一)

Vue Vue:前台框架 渐进式JavaScript框架 渐进式:vue可以控制页面的一个局部,vue也可以控制整个页面,vue也能控制整个前端项目     -- 根据项目需求,来决定vue控制项目的程度​ 使用 1.下载:https://vuejs.org/js/vue.min.js 2.导入vue.js 3.在自定义的script标签中创建vue...

phpstorm 使用 Xdebug 调试代码

用过Java、C#等静态语言的同学调试代码经常是打个断点,然后轻松调试,而PHPer调试代码时经常是 echo $a;exit; 非常的不方便,有的同学有时候打完断点没删就给commit上去了,这就造成了很多困扰,有没有办法更优雅的调试呢?那当然有的,这里用到一个PHP模块xdebug,xdebug安装教程,使用它进行PHP代码调试,能有效减少工作量和B...

OpenStack 创建虚机过程简要汇总

1. 总体流程 翻译自原文(英文):https://ilearnstack.com/2013/04/26/request-flow-for-provisioning-instance-in-openstack/ 创建虚机的请求流如下: Dashboard 或者 CLI 获取用户的登录信息,调用 Keystone 的 REST API 去做用户身份验证。...