Linux编程之gdb(二)

    想一想,自己写的程序不会调,那也太难受了吧

自己在Windows编程的时候,界面化的调式都搞不定,还能做命令行的调式?相信我。Linuxgdb调试比你想象的要好玩得多!!!!

在Linux中,gdb的调试功能十分强大。在这里可以安装一个小插件:wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh

#include<stdio.h>
#include<stdlib.h>

int add_num(int a,int b)
{
    printf("this is a test!");
    return a+b;
    
}



int main(int args,char*argv[])
{
    int a=12,b=13;
    pid_t pid;
    pid = fork();
    if(pid<0)
    {
        perror("fork");
        exit(1);
    }
    if(pid==0)
    {
        int c=add_num(a,b);
        print("%d+%d=%d",a,b,c);
        exit(1);
    }
    int c = b-a;
     int *d = &c;
     print("%d-%d=%d",b,a,*d);
     return 0;
}

这里fork()是创建子进程。插入一下:子进程和父进程拥有同样的代码段。也就是会有两个进程来执行同一段代码。不过,子进程进程号pid在这个程序中是为0的。而父进程的pid是大于0的。这样就可以区分了。pid==0是执行子进程,子进程在调用一个函数就退出了。而父进程会执行最后几行代码。

  通过gdb ./gdb_test 启动gdb 

 1. b 是打上断点   b 代码行数 或者 b 函数名    查看断点信息:info breakpoints     取消断点:delete 断点号 

1 l是查看代码  用法与b一样

3. 运行程序:r     执行下一行:n

4. 查看变量的值:p   /d 是十进制  

5. 多进程多线程调试  :由于子进程和父进程执行不同的代码。先选择跟着子进程执行 :set follow-fork-mode child     查看有几个进程:info inferiors     可以通过attach   进程号跟进程

6. 进入函数:s     快速完成函数:finish

7. 查看栈空间:bt 

8.查看堆:heap

9. 查看地址 :x  /20 是查看20个

 一点点gdb基础,希望有所帮助。。

原文地址:https://www.cnblogs.com/haibiandemoumoumou/p/11066552.html