GDB调试超详细整理

一、环境

centos7.5 

二、安装GDB

#yun install gdb
#gdb -v检查

GDB常用指令
Linux下GDB调试C++代码
Linux下调试器GDB、makefile的使用
如何用gdb调试以daemon进程运行的服务
用GDB调试程序(一)

三、GDB用法实践

有一些程序会使用到deamon(),无法直接gdb,只能查到该进程的pid
使用 #gdb -p -pid 进行调试
接下来介绍下普通调试和使用deamon的调试方法。

前期准备

编程设置:1.需要加-g,不能有-s,如g++ -g main.cpp

普通调试(无deamon)

(1)新建文件test.cpp

#include <stdio.h>

int func(int n)
{
	int sum=0,i;
	for(i=0; i<n; i++)
	{
		sum+=i;
	}
	return sum;
}

int main()
{
	int i;
	long result = 0;
	for(i=1; i<=100; i++)
	{
		result += i;
	}

	printf("result[1-100] = %d /n", result );
	printf("result[1-250] = %d /n", func(250) );
}

进入终端,准备开始调试。

g++ -g test.cpp -o test    //1.编译test.cpp
ls                                    //2.查看是否生成test程序
gdb test                         //3.进入gdb调试
l 1                                  //4.查看第一行
b 16                               //5.设置第一个断点,在16行(long result = 0;)
b func							 //6.设置第二个断点,在func函数
info b                            //7.查看设置的两个断点
r									//8.运行-(定位到long result = 0;)
n									//9.单行执行(定位到17行,for(i=1; i<=100; i++))
b                                   //10.设置第三个断点,在第22行(printf("result[1-100] = %d /n", result );)
c 									//11.跳转到第22行
p result						//12.打印result的值
c									//13.下一个断点,进入func函数
l  func                          //14.查看下func代码
finish							//15.停止
q									//16.退出gdb

在这里插入图片描述
在这里插入图片描述

daemon调试(涉及多线程调试)

gdb调试多线程
【Linux】GDB调试多线程和多进程以及Core文件
https://www.cnblogs.com/kevingrace/p/5252919.html

  • 如果一个程序有daemon,又是多线程,怎么调试?
    简单,我们先看下多线程线程数量:
    首先不使用gdb,我们先来看一下他的线程:
//安装pstree
yum -y install psmisc
//查看进程下的线程数量
 pstree -p pid (第一行包含两个,所以总共是五个)

在这里插入图片描述

然后开始gdb调试

  • 如果只是调试main.cpp文件,他在主线程,设置断点,即可调试,不用管多线程。
//设置main文件的断点
b 行号
b  Func
//directory /tmp/svn/CloudGuard/trunk/CloudNode/  //设置源码路径
//show directory   //查看源码路径
  • 如果是不同文件下,但是同一个线程,那设置不同文件下的断点,然后调试:
//设置不同文件的断点
b CClass::Func()  (可以输入b CClass,使用tab快捷键补齐)
b class.cpp:1361 (StrParser::LocalSegment所在行)
  • 如果是不同文件下,不同线程,那设置不同文件下的断点,然后调试:
//1.查看进程:info inferiors
//2.查看线程:info threads
//3.查看线程栈结构:bt
//4.切换线程:thread n(n代表第几个线程)

//设置不同文件的断点
ps -aux | grep test
gdb -p pid
b CClass::Func()  (可以输入b CClass,使用tab快捷键补齐)
b class.cpp:1361 (StrParser::LocalSegment所在行)
set scheduler-locking off //设置所有线程并行(也可以不设置)
n
然后出发到该函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值