热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux中gdb程序调试器的命令使用(包括后台进程和多线程的调试)

一、什么是gdb?              gdb是一个由GNU开源组织发布的、UNIXLINUX操作系统下的、基于命令行的、功能强大的程序调试工具。       gdb中的命令
一、什么是gdb?
       
       gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
       gdb中的命令固然很多,但我们只需要掌握其中最重要的十几个命令,就大致可以完成日常的基本的程序调试工作。

二、怎么进入gdb调试模式?
       
        不是什么可执行程序都是可以用gdb来进行调试的。要使得可执行程序能被gdb调试,必须在程序的编译过程中加入编译选项,即-g选项。这个选项将在编译的时候为目标文件加入调试信息,这样才能被gdb调试。
         gcc  -g  -c  hello.c  -o  hello.o

         上面命令编译出一个加入调试信息的目标文件hello.o
         其中: -g:加入调试信息的选项
                     -c:只编译不链接,生成目标文件,是不可执行的
                     -o:为生成的目标文件命名
        
         注意:如果一个程序有多个源文件,则要调试这个程序,则需要在生成每个源文件的目标文件的命令中加入-g选项,最后链接成的可执行程序才是可以用gdb调试的,否则调试时就出现错误  no symbol table is loaded

         一个栗子:
         有一个程序有两个源文件child.c 和 main.c ,如果要生成可被调试的最终可执行程序,需要依次执行下面命令:
         gcc  -g  -c  child.c  -o  child.o          //:生成加入调试信息的目标文件child.o
         gcc  -g  -c  main.c  -o  main.o         //:生成加入调试信息的目标文件main.o
         gcc  child.o  main.o  -o  main          //:链接child.o 和 main.o 生成最终可执行程序main
        上面命令执行之后, main就是可被调试的可执行程序
         gdb  ./main   回车
        即可进入gdb调试模式!

三、gdb调试命令(最常用的)
       
      
       run : 程序第一次执行,到第一个断点位置暂停。如果没有断点,则一直执行程序直至完成
                 run 后面可以加上参数,作为主函数main的参数
                 run 可简写为 r

       start : 进入逐行调试模式, 不会一次性执行完整个程序

       step : 一次执行一行语句, 遇到函数调用将进入函数
                    step 可简写为 s

       next : 一次执行一行语句,但遇到函数调用不进入
                    next 可简写为 n

       returnfinish : 单步进入函数后,直接跳出函数

       bt : 查看堆栈信息, 可以查看到段错误发生的行号

       list : 查看当前行附近的所有代码(默认显示10行)
                 list 5, 10 : 显示当前文件 5 到 10 行的内容
                 list test.c : 5, 10   : 显示test.c文件的 5 到 10 行的内容
                 list main  : 显示main函数周围的代码
                 list test.c function : 显示test.c文件中函数function周围代码
                 list 可简写为 l

       break : 设置断点
                       break main : 可以给一个函数设置断点
                       break 12   : 可以为当前文件的某一行设置断点
                       break test.c 12 : 给源文件test.c 的第12行设置断点
                       break 可简写为 b

       info breakPoint : 查看所有断点信息(断点位置,断点编号...)
                                             可简写为 i b

       delete : 删除断点
                       delete 4 : 删除断点号为4的断点
                       delete :  即不指定断点编号,则删除所有断点
                       delete 可简写为 d

       continue : 继续执行运行程序,到下一个断点暂停 或 watch 变量对象变量改变时暂停
                              continue 可简写为 c

       print : 查看某个变量的内容
                     print a : 输出变量a的值
                     print 可简写为 p

       watch : 监控一个变量,当变量发生改变时,程序会停止
                        watch a : 监控变量a,如果a的值发生了改变,则程序暂停


后台进程调试:

       将指定进程链接进入gdb调试:
              gdb -p + PID : 可以进入正在运行的后台程序的调试模式
                                      pID 指的是进程的ID

              attach + PID : 在gdb内部命令环境进入一个后台进程的调试模式
                                      解除当前链接进gdb的进程:
                                      detach
多线程调试: 

       info thread
: 查看所有线程信息(线程编号... 其中标识*指的是当前调试的线程)
       thread + 线程编号 : 可以切换调试线程

Linux中gdb程序调试器的命令使用(包括后台进程和多线程的调试)

       set scheduler-locking on : 锁定调试线程,即只运行当前调试线程,其他线程不运行
       set scheduler-locking off : 关闭锁定, 所有线程都会运行




推荐阅读
  • 编译原理c语言词法分析器,用C语言实现一个真正的词法分析器
    词法分析,是编译器的第一个模块,也是最简单的模块。最简单,指的是相对于编译器这种大型程序而言,与一般的代码相比还是有点复杂的 ... [详细]
  • 编译linux搭建vs2015,使用Vs2015开发linux(centos7)程序
    1.首先下载vs2015withupdate32.然后下载VisualCforLinuxDevelopment3.在centos7上yuminstallopenssh-server ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • 零入门kubernetes网络实战15>基于golang编程实现给ns网络命名空间添加额外的网卡
    《零入门kubernetes网络实战》视频专栏地址https:www.ixigua.com7193641905282875942本篇文章视频地址(稍后上传)本篇文章主要是想通过g ... [详细]
  • 闲话少说,直接切入主题,之前也是用一下其他的IDE,但是总是在vi和IDE之间来回切换,比较麻烦,于是乎,找了几个插件亲身体验,功能挺不错;1、安装vi7.0vim的官方网站是:www.vmuni ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • GPS 校验和 代码_Linux recovery 移除签名校验
    原创作者:王锐,多年Linux系统、龙芯平台移植与优化研发经验,LinuxContributor、Mozillian。背景某个设备配套的刷 ... [详细]
  • 在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。对于yaml文件,ros中用的较早版本的yaml- ... [详细]
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • Swoole是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP ... [详细]
  • 前言可能你并不太了解msys2,但是作为一个程序员,你一定知道mingw,而msys2就集成了mingw,同时msys2还有一些其他的特性,例如包管理器等。msys2可以在wind ... [详细]
  • ImnewwithWinInetandhavefollowingsimpleC++code:我是WinInet的新手,有以下简单的c++代码:voidDoIt(std::s ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
author-avatar
洋洋哥2602913063
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有