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项

更多gdb指令:

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.