即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

linux下gdb调试应用程序

编程语言 qqliyunpeng 40℃ 0评论
本文目录
[隐藏]

1.1. 简介


        GDB,是GNU工程调试器,允许你去查看在程序运行的时候里边的东西,或者查看当程序crash的那一刻,其他程序正在做啥。为了获取行为中的bug,GDB可以做的主要有4件事:

  • 开始你的程序,指定可能影响程序的任意行为
  • 让你的程序停止在指定的条件下
  • 检查你的程序停止时发生了什么
  • 改变程序中的一些东西,然后可以查看改变的东西对一个bug和其他的影响

2.2. 开启图形化界面


想要对应用程序用gdb调试需要在编译的时候添加-g选项
然后就可以将输出的文件进行gdb调试了,假如输出的文件是a.out。则
gdb -tui -q a.out 或者是 gdb a.out然后按ctrl+x+a 就如如下的界面

【1】-tui 选项是这个界面的关键,-q表示的是不打印(gdb)之前的好多声明
【2】此界面有好处也有坏处,好处是代码实时的显示在上边,会出也很明显,供操作显示的界面小了,如果你想打印出一个函数的反汇编,那他的劣势就很明显了


3.3. 基本操作(红色部分是简写)


3.1.3.1

list [linenum/function] — 显示linenum周围的源代码或者是显示函数名function的函数的源代码

        ”list -” — 显示当前行之前的固定行,固定行的重新设定可以用如下命令 set listsize [count],如果只是想看一下用show listsize就可以

        “list +” — 显示后边

        list [first], [last] — 显示从first到last行之间的代码

        list ,[last] — 从当前行到last之间的代码

start — 开始调试程序,程序指针会指向main中的第一行

run — 如果是这个,相对于start来说会找断点,停到断点出,如果没有断点,则执行完

next — 但不执行下一行,如果遇到函数,不会进入函数执行

step — 单步运行,如果有函数,进函数继续单步运行

continue — 继续执行,知道遇到断点


3.2.3.2 断点相关操作:

break    在进入指定函数时停住


break    在指定行号停住。


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


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


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


delete    删除所有断点


delete breakpoint [n]    删除某个断点


disable breakpoint [n]    禁用某个断点


enable breakpoint [n]    使能某个断点

clear 清除所有断点


3.3.3.3 显示相关

自动显示观察的变量: — 就是在每运行一次,都会有显示

        display {a,b…}

删除显示的变量

        undisplay {a,b…}

        delete display {a,b….}

不删除,只是使能和屏蔽

        disable display

        enable display

dispay部分的格式控制同print中的格式控制一样


还有一种需求是,当每个变量只在他变化的时候显示:

        watch{a,b…}


info 命令: — 列出所有

        info break :查看一共多少个break

        info display:查看一共有多少个display


print 命令: — 打印

打印出数组:

①动态数组

        p *[数组首地址]@[数组中元素的长度

②静态数组

        p [数组首地址]

输出时的格式控制

        x  按十六进制格式显示变量。


        d  按十进制格式显示变量。


        u  按十六进制格式显示无符号整型。


        o  按八进制格式显示变量。


        t  按二进制格式显示变量。 


        a  按十六进制格式显示变量。


        c  按字符格式显示变量。


        f  按浮点数格式显示变量。

使用时是这个样子:p/a [你要打印的变量]


backtrace 命令: — 打印堆栈(函数调用栈的所有信息)

        简写是 bt


3.4.3.4 显示源代码的内存

        你可以用info line命令来查看源代码在内存中的地址,他后边可以跟行号,函数名,这个命令会打印出所指定的源代码在运行时的内存地址。

        你也可以查看源代码的当前执行的机器码,用disassemble命令会把目前内存中的指令dump出来,一般他后边跟的是行号,函数名。



转载请注明:CodingBlog » linux下gdb调试应用程序

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情