• 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基础,希望有所帮助。。

  • 相关阅读:
    今天入住博客园,希望有个好的开始,自己在这边可以学习成长
    浅谈 C# ref 和 out 的使用方法
    类之间的几种关系
    VB6.0 文件日志读取
    基于NPOI的Excel导入和导出功能
    WebService的创建,发布与调用
    C# OfType 的使用
    Vb6.0 文件日志记录
    ZipInputStream
    [转载]遗传算法入门
  • 原文地址:https://www.cnblogs.com/haibiandemoumoumou/p/11066552.html
Copyright © 2020-2023  润新知