一、环境
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
然后出发到该函数