手把手教你调试Linux C++ 代码

软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求。Windows下Visual Studio为我们做了很多的工作,使初学者基本上可以获得一个所见即所得的调试体验,相对来说也比较容易上手。然而在linux平台下,一切都显得有些不同,倒不是说GDB有多难,只是对于习惯了visual studio的人来说刚开始会有些不适应。然而对于那些在windows 平台下使用windbg调试代码的人来说,情况会好很多,但是也要有个思维方式的转变以及调试命令的再适应过程。本文将带你开启GDB 调试 Linux 下 C/C++的大门。

Agenda

1. 准备条件

2. GDB调试单执行文件

3. GDB调试静态链接库

4. GDB调试动态链接库

1. 准备条件

由于Linux下没有visual studio, 对于程序的编译需要借助makefile,下面我先晒出一个简单的makefile,不求大而全,小巧可用就好。

#makefileCC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g
LDFLAGS=-g
LDLIBS=
AR=arSRCS=main.cc functions.cc
OBJS=$(subst .cc,.o,$(SRCS))all: main
main: $(OBJS)$(CXX) $(LDFLAGS) -o main $(OBJS) -L. $(LDLIBS) main.o: main.cc functions.h testobj.hfunctions.o: functions.h functions.ccclean:$(RM) $(OBJS)all-clean: clean$(RM) main

如下是相关的三个文件直接copy就可以使用

main.cc/functions.cc/functions.h

 1 #include<iostream>
 2 #include"functions.h"
 5 int main()
 6 {
 7 std::cout << "Enter two numbers:" << std::endl;
 8 int v1 = 0, v2 = 0;
 9 std::cin >> v1 >> v2;
10 std::cout << "The sum of " << v1 << " and " << v2
11 << " is " << v1 + v2 << std::endl;
12
13 function();
14
15 return 0;
16 }

1 #include<iostream>
2 int function(void)
3 {
4     std::cout << "I am in a function!" << std::endl;
5     return 0;
6 }

1 int function(void);

将这4个文件放入一个目录下,到这个目录下直接执行make就会产生一个可执行文件main。

2. GDB调试单执行文件

调试结果如下:solidmango@solidmango-pc:~/testmake/Test_L1$ gdb main
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Reading symbols from main...done.(gdb) b 2 //在第二行设置断点
Breakpoint 1 at 0x400a4a: file main.cc, line 2.
(gdb) r //全速运行
Starting program: /home/solidmango/testmake/Test_L1/mainBreakpoint 1, main () at main.cc:7
7    std::cout << "Enter two numbers:" << std::endl;//断点命中
(gdb) s
Enter two numbers:
8    int v1 = 0, v2 = 0;
(gdb) s //单步执行
9    std::cin >> v1 >> v2;
(gdb) n
5
6
11    << " is " << v1 + v2 << std::endl;
(gdb) s
10    std::cout << "The sum of " << v1 << " and " << v2
(gdb) s
11    << " is " << v1 + v2 << std::endl;
(gdb) s
The sum of 5 and 6 is 11
14    function();
(gdb)

3. GDB调试静态链接库

对于静态链接库的调试和单个的执行文件相似,因为最终的文件都被链接在一起。对于静态链接库的调试需要两个额外两个辅助文件以及对makefile和main.cc稍作修改,具体改动如下:

#makefile
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g
LDFLAGS=-g
LDLIBS=-ltest #changed
AR=arSRCS=main.cc functions.cc
OBJS=$(subst .cc,.o,$(SRCS))all: main
main: $(OBJS) libtest.a #changed
$(CXX) $(LDFLAGS) -o main $(OBJS) -L. $(LDLIBS) main.o: main.cc functions.h testobj.h functions.o: functions.h functions.cc 

clean: $(RM) $(OBJS) 

all-clean: clean $(RM) main

main.cc/testobj.cc/testobj.h

#include<iostream>
#include"functions.h"
#include"testobj.h"int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;function();TestObj();return 0;
}

#include<iostream>
int TestObj(void)
{std::cout << "I am in TestObj!" << std::endl;return 0;
}

int TestObj(void);

执行结果如下:

solidmango@solidmango-pc:~/testmake/Test_L1$ g++ -g -c -o testobj.o testobj.cc
solidmango@solidmango-pc:~/testmake/Test_L1$ ar rv libtest.a testobj.o
ar: creating libtest.a
a - testobj.o
solidmango@solidmango-pc:~/testmake/Test_L1$ make
g++  -g  -c -o main.o main.cc
g++  -g  -c -o functions.o functions.cc
g++ -g -o main main.o functions.o -L. -ltest
solidmango@solidmango-pc:~/testmake/Test_L1$ ./main
Enter two numbers:
5
6
The sum of 5 and 6 is 11
I am in a function!
I am in TestObj!
solidmango@solidmango-pc:~/testmake/Test_L1$ 

4. GDB调试动态链接库对于动态链接库的调试和单个的执行文件差别较大,相对于静态链接库的调试只需要对makefile

稍作修改,具体改动如下:

生成相应的动态库并copy到系统目录

g++ -g -c -fPIC -o testobj.o testobj.cc
g++ -g  -shared -o libtest.so testobj.o
sudo cp libtest.so /lib/libtest.so

makefile

CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g
LDFLAGS=-g
LDLIBS=-ltest
AR=arSRCS=main.cc functions.cc
OBJS=$(subst .cc,.o,$(SRCS))all: main
main: $(OBJS) libtest.so$(CXX) $(LDFLAGS) -o main $(OBJS) -L. $(LDLIBS) main.o: main.cc functions.h testobj.hfunctions.o: functions.h functions.ccclean:$(RM) $(OBJS)all-clean: clean$(RM) main

调试结果如下:solidmango@solidmango-pc:~/testmake/Test_L1$ gdb main
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
(gdb) b TestObj
Breakpoint 1 at 0x400910
(gdb) r
Starting program: /home/solidmango/testmake/Test_L1/main
Enter two numbers:
7
8
The sum of 7 and 8 is 15
I am in a function!Breakpoint 1, 0x0000000000400910 in TestObj()@plt ()
(gdb) s
Single stepping until exit from function _Z7TestObjv@plt,
which has no line number information.
TestObj () at testobj.cc:3
3   {
(gdb) bt
#0  TestObj () at testobj.cc:3
#1  0x0000000000400b05 in main () at main.cc:17
(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7ddaae0  0x00007ffff7df54e0  Yes         /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd8850  0x00007ffff7bd89c5  Yes         /lib/libtest.so
0x00007ffff792f5c0  0x00007ffff799299a  Yes (*)     /usr/lib/x86_64-linux-gnu/libstdc++.so.6
0x00007ffff752d4a0  0x00007ffff7673413  Yes         /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff720d610  0x00007ffff727c1b6  Yes         /lib/x86_64-linux-gnu/libm.so.6
0x00007ffff6ff4ab0  0x00007ffff7004995  Yes (*)     /lib/x86_64-linux-gnu/libgcc_s.so.1
(*): Shared library is missing debugging information.
(gdb) list
1   #include<iostream>
2   int TestObj(void)
3   {
4       std::cout << "I am in TestObj!" << std::endl;
5       return 0;
6   }
(gdb)

总结

本文总结了Linux下基于GDB的3种情况的调试方式,其中包括单个可执行文件,静态链接,动态链接,并给出了完整的makefile, 源文件,可操作性极强,建议感兴趣的朋友亲自动手操作演练,希望对大家有所帮助。

转载于:https://www.cnblogs.com/pugang/p/4005798.html

手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)相关推荐

  1. 手把手教你写Linux I2C设备驱动

    手把手教你写Linux I2C设备驱动 标签:Linux 设备 驱动 详解 i2c 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http:/ ...

  2. 在linux下怎么安装mysql,手把手教你在Linux系统下安装MySQL

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...

  3. 手把手教你搭建Linux开发环境(VMware+Ubuntu)(二)——安装VMwareTools并设置共享文件夹

    刚刚装好了Ubuntu,安装VMware Tools会让我们有更好的体验,那么为什么要安装VMware Tools?该如何安装呢?本篇博客将手把手教你安装VMware Tools,并设置共享文件夹. ...

  4. 正点原子linux驱动教程,正点原子 手把手教你学Linux之驱动开发篇

    简 介 该课程是正点原子手把手教你学Linux系列课程,该课程配套开发板为正点原子alpha/mini Linux开发板. 手把手教你学Linux之驱动开发篇: 第1讲 Linux驱动开发与裸机开发区 ...

  5. 手把手教你在Linux上安装LaTeX环境

    Original artical url: http://www.ylzx8.cn/linux/linux-unix/280361.html 手把手教你在Linux下安装LaTeX环境 一.LaTeX ...

  6. C# 用真实需求,手把手教你写面向对象的代码

    好久没写过文章了,这里工作很忙. 今天继续给大家讲解下,怎么写面向对象的代码.之前也写过类似的文章,但那都是随便举的例子,不是活生生的现实案例. 今天使用我刚写的项目来举例子,它是真实存在的需求案例, ...

  7. 手把手教你搭建Linux开发环境(VMware+Ubuntu)(一)——安装VMware虚拟机和Ubuntu

    前言 近期好多小伙伴都开始学习Linux内核了,那么如何搭建一个Linux运行环境,变成Linux内核初学者的拦路虎,今天我就一步步详细解说一下,如何使用虚拟机VMware安装Ubuntu,跟我一起开 ...

  8. 【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库

    [填坑之旅]手把手教你如何用AndroidStudio上传自己的library到Jcenter库 前言:我们在使用AndroidStudio的时候,会经常用到第三方的代码库.引入第三方库的方式无非就是 ...

  9. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

最新文章

  1. ThreadPool原理介绍
  2. Python---根据字符串导入包(importlib)
  3. 2022年全球及中国燃气供应系统 (FGSS)行业设施规模与十四五布局建设报告
  4. 重启计算机设的桌面背景就没了,桌面壁纸无法保存怎么办?Win7系统重启后不保存桌面背景解决方法...
  5. Oracle中PLSQL中一个例外的写法
  6. springboot做网站_Github 上 Star 最多的个人 Spring Boot 开源学习项目
  7. 软工1816 · Alpha冲刺(9/10)
  8. 2009年存储市场10大预测 厂商并购在所难免
  9. 数据科学入门与实战:Seaborn002热力图等
  10. spark学习-70-源代码:Endpoint模型介绍(2)-启动流程
  11. 4.二叉搜索树转为有序双向链表(递归算法与非递归算法)
  12. 39岁阿里P9失业了,总资产1.5亿……
  13. c语言大赛评分用数组,C语言大赛现场评分系统
  14. android拦截返回键home键,android屏蔽返回键跟Home键
  15. 数据可视化笔记5 时间数据可视化
  16. java-贪吃蛇小游戏
  17. 【硬件】【RF 连接器】
  18. python 学习笔记第一篇---下载网页内所有图片
  19. 阿里云centOS7安装好Nginx设置外网可以访问80端口
  20. C 喵帕斯之天才算数少女 SDUT

热门文章

  1. 样条曲面_用SolidWorks曲面制作一个:台灯底座造型
  2. RuoYi框架使用手册
  3. python构造自定义数据包_pytorch中的自定义数据处理详解
  4. uni-app获取当前具体日期时间并将其格式化
  5. ionic滚动条返回顶部
  6. 数据库某个字段增加或减少数量
  7. linux e1000e 网卡驱动,在centos7上安装intel e1000e 网卡驱动
  8. js给php赋值,JavaScript_javascript给span标签赋值的方法,js给span标签赋值的方法?一般 - phpStudy...
  9. dispatcher在java中什么含义_java-我可以使用在DispatcherServlet上下文中声...
  10. c 连接oracle 通用类,c#操作oracle,有没有相仿sqlhelp之类的通用操作类(6)