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了,退出调试,那么这个程序也就结束了。

posted @   TechNomad  阅读(336)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示