问答详情
源自:4-1 计算机中的数据表示方法

gdb调试的问题

gdb调试不懂啊,能在讲一下嘛

提问者:慕婉清3143948 2016-04-11 19:19

个回答

  • 小雾3378873
    2016-07-12 10:51:05

    一段程序执行太快了,若想知道该程序在执行过程的每一步执行后对结果的影响或者了解该语句的作用,则需要一种调试工具,让他动作变慢,并且随着你的控制让他一步一步的执行,而且其间你可以用一些命令查看内存,验证结果,这就是gdb调试工具的作用。以下是我的笔记:

    GDB可以对程序进行断点调试,单步调试,

    如果用gdb调试,需要对程序重新编译,格式为:

    gcc –g main.c –o main.out

    这样生成的main.out才能用gdb调试。

    需要注意的是,在调试的时候不能删除原代码文件,即main.c ,如果将main.c删除了,gdb依然不支持断点、单步调试。

    用gdb调试程序格式:gdb ./main.out  或gdb main.out

    list 或者 l  列出当前调试程序的部分(前10行)源代码。

    再按一次回车(默认执行上一次命令),继续列出下面的源代码

    单步调试命令:start

    执行后显示:默认断点1在main()处,具体行数为本文件的第13行

    第13行的指令为:int a=5;

    查看内存中变量的值,print a    简写 p a 回车

    显示a的值

    因为int a=5;指令还没有执行完毕,所以a为编译器给的默认值。

    n 回车  下一条指令  n----next

    s 回车  执行一行源代码并进入函数内部    s----step

    当前被调用函数将实参赋于形参,并定位到第5行

    bt 回车  查看函数堆栈

    编号0   change 函数   定位到第6行

    编号1   main函数    定位到第15行

    编号0在最上层,所以当前在change 函数中

    f 编号   可以定位到哪一层函数f(frame)切换调用的上下文,进入相应的栈里,使用该命令可以打印栈层编号,当前的函数名,函数参数值,函数所在的文件及行号,函数执行到的语句等等;

      例:f 1

     

    进入到编号1的函数中,即main函数  并定位到15行的那条语句

    q   退出调试

    3-2使用gdb调试案例

    &取地址符

    0x 十六进制符号

    a=0xbffff064  给形参a赋的值是0xbffff064的内存地址

    b=0xbffff068  给形参b赋的值是0xbffff068的内存地址

    int temp=*a;//将内存地址a中的存储的数据赋值给整型变量temp,即temp=5.

    int temp =a;//将内存地址a赋值给整型变量temp,即temp=0x bffff064

    跟着老师的视频做,一步一步的,就会理解该工具命令的含义了。

  • n00b
    2016-04-13 23:35:51

    你可以把这段视频多看几遍