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指令: