GDB调试之启动调试与程序执行(二)
一、启动调试并传入参数
调试代码如下所示:
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; } |
传入参数的三种方法:
1.gdb --args <可执行程序> parameter1 parameter2 parameter3
输入命令 :
输出结果如下:
2.set args parameter1 parameter2 parameter3
先进入GDB调试中,在执行run命令之前使用set设置参数:
3.r parameter1 parameter2 parameter3
二、附加到进程
如果我们想调试一个程序,但是这个程序已经启动了,我们没有办法使用gdb去启动这个程序了,因为如果用gdb再去启动程序就会启动一个新的程序并在新的程序上调试,而不是在原先的这个程序上进行调试了。所以说附加到进程适用于某个已经启动的程序。
1 2 | gdb attach <pid> gdb --pid <pid> |
三、逐步执行
1.逐过程执行
单步执行(step-over),使用next(简称n)命令单步执行。在执行n命令或者next命令的时候,如果这行代码没有函数调用,那么就直接执行完到下一行代码;如果这行代码里面有函数,那么也会直接跳过函数继续往下执行,不会进入到函数里面。
2.逐语句执行
单步执行(step-into),使用step(简称s)命令执行,当遇到函数时,进入到函数里面去单步执行。
代码中有一个order_bus()函数,可以在此函数处打一个断点:
在order_bus()函数中调用量total_bus()函数,如果继续执行命令n,那么将不会进入到total_bus()函数中,会跳过total_bus()这个函数继续向下执行,如果继续执行命令s的话,那么就会进入到total_bus()函数中,如上图所示,继续在total_bus()函数中执行命令n或者s将会继续向下调试。
四、退出当前函数
finish命令就是如果我们当前在一个函数里面,那么我们执行finish命令的时候就会退出这个当前的函数,进入到上一个调用的地方。
程序通过gdb启动后,在函数oder_bus()函数处打了一个断点,执行命令n后直到遇到total_bus()函数,如果想要进入total_bus(),则需要使用s命令,成功进入total_bus(),这时忽然不想继续再调试执行total_bus()函数中的代码了,此时执行命令finish,这时就会返回到上一次我们调用total_bus()函数的地方,即if (number + ordered_bus_number > total_bus()),并且返回值为0。
五、退出调试
如果我们现在正在进行调试但是我们不想调试一个程序了,那么我们可以使用以下三种方式来结束dbg调试。
detach(分离):detach就是从程序分离,无论这个程序在做什么,detach的时候对这个程序是不影响的。如果我们使用attach的方式进来的,detach后程序还是会继续运行,只是调试器退出了。
上述调试过程表明,gdb调试器已经退出了,但是程序还是在继续运行。
quit/q(退出):如果我们是以启动的方式调试将程序启动起来的,如果我们quit了,退出调试,那么这个程序也就结束了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?