GDB调试之准备工作(一)
一、C++调试准备工作
调试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> int main( int argc, char ** argv) { int iTest = 100; const char * str = "this is a test" ; std::cout << "iTest is " << iTest << ",str is" << str << std::endl; std::cout << "参数为:" << std::endl; for ( int i = 0; i < argc; ++i) { std::cout << argv[i] << std::endl; } std::cout << "hello world" << std::endl; return 0; } |
执行编译命令:gcc hello_world.cpp -o hello_world -lstdc++,然后使用GDB进入调试模式:gdb hello_world
"No debugging symbols found in hello_world"表示可执行程序没有调试信息。需要在编译的时候加入 "-g"参数,即gcc hello_world.cpp -o hello_world -lstdc++。执行结束后再次通过GDB进入调试模式:
"Reading symbols from hello_world..."表明可执行程序中已经存在调试信息。
二、GDB调试中常用的命令
1.list命令
显示源代码,默认显示10行,再次输入l后,会继续向下显示源代码
2.break命令
break命令简称b,为程序设置断点。比如说在上述代码的main函数中设置断点,输入命令"b main",结果如下所示,表示在main函数的第四行设置断点。
设置断点的方法有很多种,比如说"b + 文件名:行数",即可在指定文件的所在行中设置断点,如下所示:
输入"i b"命令可以查看设置的断点:
3.run命令
run简称r,输入r之后就开始执行我们的程序。以为上述代码我们设置了两个断点,所以它启动后,遇到这个断点就会中断下来。
因为我们在代码的第四行设置了一个断点,所以程序在第四行的时候停止了下来。
这个时候可以继续往下执行,输入n或者next这个命令它就会往下执行。n代表往下执行一步,此时会走到代码的第五行,iTest也被赋值为100,我们可以通过查看命令p,也就是print的意思,来查看iTest的值。
此时第五行代码还未执行,如果此时查看str变量的值,会发现,它的值是乱码的。需要往下继续执行,然后再查看str的值。
4. 显示全部的局部变量
输入"i locals"命令可以显示文件中的局部变量
5.continue命令

继续往下执行:
可以看出多出了一个局部变量i,以为执行到了for循环中,for循环中存在临时变量i。继续输入命令c,直到遇到下一个断点为止,如果没有断点的话,会继续执行直到程序运行结束。
输入命令quit,可以退出GDB调试。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器