Linux之GDB调试(一)

发布时间 2024-01-10 14:47:24作者: TechNomad

一、C++调试准备工作

调试代码:

#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"命令可以显示文件中的局部变量