日期:2014-05-16  浏览次数:20730 次

linux下编译、调试c程序
linux下编译、调试c程序

1.用gcc编译
   gcc -g -o hello hello.c  # -g意思是让目标程序中带有源代码信息,这样才能断点调试; -o hello的意思是将目标程序编译、连接为hello文件
   ./hello  #执行hello

2.用gdb调试: 一个典型的例子
   gdb hello  #对hello进行调试,这时会进入gdb输入状态;程序将接受gdb指令
   (gdb)list #显示源代码,即hello.c文件里的代码
   (gdb)break 10 #在第10行设立一个断点,这个断点将编号为1
   (gdb) run   #让程序执行; 它将在第10行处中断。假设本行的代码是 k = sum(i, j)
   (gdb) display i #显示i的值
   (gdb) whatis i #显示i的数据类型
   (gdb) set variable i = 5 #把变量i的值变成5
   (gdb) step #单步执行。这里将进入sum(i,j)函数,gdb将显示 sum()函数里的第一行代码,如 return real_sum(a,b)
   (gdb) next #单步执行。这里将直接执行real_sum(a,b)函数而不进入它。到这里你可以看出step和next的区别了。
   (gdb) break 11 #再在第11行处设一个断点,这里的第11行是整个hello.c文件的第11行,不是当前函数里的第11行
   (gdb) cont #即continue,让程序自已往下走,直到它遇到断点或者整个程序结束完毕; 在本例中, 程序将从sum()函数回到主函数,然后停在我们刚刚设置了断点的第11行
   (gdb) clear 10 #去掉第10行的断点
   (gdb) delete 2 #去掉第二个断点,也就是第11行的断点
   (gdb) kill #终止正在运行的程序
   (gdb) quit #退出本次调试

3.用gdb调试:调试循环代码块时可以用到的技巧
   (gdb) break 10  #在第10行设置断点,断点自动编号为1
   (gdb) condition 1 i == 3 #  只有当i == 3时,第1个断点才有效
   (gdb) run #验证一下
   (gdb) break 11 #在第10行设置断点,编号为2
   (gdb) ignore 2 3 #忽略断点2三次,到第四次走到第11行时,程序才会停下来
   (gdb) cont #验证一下
   (gdb) tbreak 9 #在第9行设置临时断点,设了这个断点后,程序第一次走到#9行会中断一下,第二次就不会了
   (gdb) cont #验证一下 
   (gdb) jump 12 # 继续执行,忽略第12行之前的所有断点,在第12行中或之后的第一个断点处停下来

4. 断点和其它设置项的管理指令
   a.断点:
     增: break 10
     删: clear 10 (第10行的断点), 或 delete 1 (第1个断点)
     无效/有效:disable 1, enable 1 (第1个断点)
     查: info break #列出所有断点
   b.display
     增: display i*2
     删: delete display 1 #第一个display
     查: info display  #列出所有display项