linux下gdb调试应用程序

来源:互联网 发布:银行卡网络异地消费 编辑:程序博客网 时间:2024/05/18 12:42

1. 简介


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

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

2. 开启图形化界面


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

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


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


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 断点相关操作:

break <function>    在进入指定函数时停住
break <linenum>    在指定行号停住。
break +/-offset    在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum    在源文件filename的linenum行处停住。
break ... if <condition>    ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环语境中,可以设置break if i=100,表示当i为100时停住程序。


delete    删除所有断点
delete breakpoint [n]    删除某个断点
disable breakpoint [n]    禁用某个断点
enable breakpoint [n]    使能某个断点

clear 清除所有断点


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 显示源代码的内存

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

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



0 0
原创粉丝点击