GDB调试

2024-01-01 13:06:59

GDB调试

一、基本常用指令

1.1 调试前的准备

用gcc/g++编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加 -g 的参数。

gcc -g -o book book.c

gdb book

请添加图片描述

1.2 基本调试命令

命令                   命令缩写             命令说明 
set args                                设置主程序的参数。
break                   b               设置断点。
run                     r               开始运行程序。运行到第一个断点位置,如果没有断点就直接运行结束。
next                    n               执行当前行。如果当前行包含函数调用,不会进入函数。
step                    s               执行当前行。如果当前行包含函数调用,则进入函数,执行函数体第一条语句。注意,如果函数是库函数或者第三方提供的函数,由于没有源代码,也无法进入函数体。
print                   p               显示变量或表达式的值。
continue                c               继续运行程序,直到下一个断点或者程序结束。
set var name = value                    设置变量的值。
quit                    q               退出gdb环境。

二、调试core文件

2.1 什么是core文件?

core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump文件,默认生成位置与可执行程序位于同一目录下,文件名为core。

2.2 如何调试?

程序挂掉时,系统默认不会生成core文件。

ulimit -a:  查看系统参数,若后面的数字为0,则代表不生成core文件
ulimit -c unlimited:    将core文件大小设置为无限制,即生成core文件
gdb 程序名 core文件名:  查看core文件

请添加图片描述
请添加图片描述

三、调试正在运行的程序

获取程序运行的进程id:   ps -ef | grep book(程序名)
调试指定进程:  gdb -p 进程id
    note:   此时,程序在输入调试命令之后会暂停。
            输入命令q退出后,程序继续运行。
            如果运行程序没有暂停,有可能是权限的问题,命令前加上sudo。
查看程序的函数调用栈:  bt

请添加图片描述

四、调试多进程程序

调试父进程:    set follow-fork-mode parent(缺省)
调试子进程:    set follow-fork-mode child

请添加图片描述
请添加图片描述

设置调试模式:  set detach-on-fork [on | off]
    表示调试当前进程时,其他进程是否继续运行。
    	on,其他进程继续运行,默认情况;
    	off,其他进程被挂起。

请添加图片描述

查看调试的进程信息:    info inferiors
切换当前调试的进程:    inferior 进程编号(非进程id)

请添加图片描述

五、调试多线程程序

查看当前运行的进程:    ps aux | grep 程序运行名
查看当前运行的轻量级进程即线程:    ps -aL | grep 程序运行名
查看主线程和子线程的关系:  pstree -p 主线程id

请添加图片描述

查看断点信息:  info b
查看线程信息:  info threads
    note:线程编号前的*代表当前线程
切换线程:  thread 线程编号

请添加图片描述
请添加图片描述

只运行当前线程:    set scheduler-locking on
运行全部线程:  set scheduler-locking off(默认)
指定某线程执行某gdb命令:   thread apply 线程id cmd
全部线程执行某gdb命令: thread apply all cmd

请添加图片描述
请添加图片描述
请添加图片描述

六、调试服务程序运行日志

问题:单纯的设置断点或者单步追踪可能会干扰多进程或多线程之间的竞争状态,从而看到的是一个假象。在多进程或多线程开发环境中,一旦某个进程或线程被设置断点,则另外的进程可以继续执行,就会破坏并发的场景。

解决办法:输出log日志。

相关日志框架:http://www.freecplus.net/9ebb8276265b404488a3415be224ed85.html

Note: 学习视频

https://www.bilibili.com/video/BV1ei4y1V758?share_source=copy_webvd_source=c471ece78e14625ba66c40c2896b30a9![请添加图片描述](https://img-blog.csdnimg.cn/2bb667d69a484df09683a0c1fb6855a6.jpeg)

文章来源:https://blog.csdn.net/weixin_44628585/article/details/126361875
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。