写在前头
linux下编码调试,gdb是授权工具,很多系统都内置gdb工具,如果没有,自己装一个也不是什么难事。一直以为命令行下实现诸如vs里面的单步调试,打印变量,查看堆栈等等是何其麻烦的事,所以通常都是在Windows下编码调试ok了,再移到linux下编译。最近比较闲,正好手上有个小工程在linux已经编码完成,又不想再移到window搞一把,遂来研究一下gdb调试的问题;粗略的学了下入门级的教程,发现利用gdb调试实现前述的那些基本调试技巧,也是十分方便的。下面记录下gdb基本且常用的功能。
例程
上述程序包含两个文件main.cpp, func.h,主要是为了跨文件调试。
gbb调试
编译:要先启用gdb调试,需要在编译的时候添加相应的编译选项 "-g"(还有个宏开关“-DDEBUG” 不知道要不要带上),将调试信息编译到目标文件;所以编译上述文件 "g++ -g main.cpp func.h -o test_gdb",生成带调试信息的可执行文件"test_gdb"。
启动调试: gdb test_gdb, 会打印一堆东西
输入命令: l -->改命令列出代码,一般没啥用;
设置断点:目前发现gdb可以根据行号和函数名设置断点,设置两个断点,第10行和test_add处设置,即输入 break 10,break test_add
启动执行: 输入r ,即run命令,执行程序,程序会停在第一个断点出
逐行执行:输入 n ,即next,逐行执行代码
跳到下一个断点处: 输入c,即contiune,程序执行到下一个断点处停下
单步调试:怀疑test_add函数用问题,输入step进入函数,也就实现了跨文件调试的功能
查看变量:输入 p param, print 参数值
退出调试: 输入quit
至此,基本的调试就完成了。
附加功能
条件断点:设置条件断点,有时候程序在循环内部崩溃,比如循环执行到101次时挂了,单步执行要100次"n"命令,此时可以在循环处设置条件断点;例如:
可想在xxx处设置断点,调试进入该文件或函数,然后设置条件:break if i==100,之后输入命令"c",循环执行100后停下。
程序崩溃查看调用堆栈:
调试时可以不设置断点,运行程序,崩溃后输入"bt
",即可看到程序调用堆栈信息,就可以很容易知道挂在哪个函数,后面直接进入该函数进行调试。
总结
暂时只了解到这些功能,后续新get到会持续更新。in a word,gdb is simple.