Ubuntu环境下使用GDB调试C语言项目

1. 安装gdb
//终端输入
sudo apt-get install gdb
2. 启动gdb
gdb

GDB常用命令大全,参考此篇博客

使用GDB调试C项目中的makefile

1.在内核配置中启用调试信息: 在内核配置中,确保启用了调试信息。可以通过以下步骤来配置内核:

make menuconfig

报错:make: *** 没有规则可制作目标“menuconfig”。 停止。参考1、参考2.

安装libncurses5-dev命令:apt-get install libncurses5-dev

补充其他包:sudo apt-get install build-essential kernel-package libncurses5-dev libssl-dev

There are services installed on your system which need to be restarted when certain libraries, such as libpam, libcYou can choose this option to avoid being prompted; instead, all necessary
Restart services during package upgrades without asking?

您的系统上安装了一些服务,当某些库(如libpam、libc)时,这些服务需要重新启动。您可以选择此选项以避免出现提示;相反,在包升级期间无需询问即可重新启动所有必要的服务?

可根据实际情况选择,这里选择的是“否”,然后又有个弹框按“esc”键即可。

ubuntu18.04.1安装linux内核源码命令:

1.查看已安装的内核版本: 首先,查看当前系统安装的内核版本。您可以使用以下命令:

uname -r

记下内核版本号,例如 4.15.0-213-generic

下载内核源码:
使用 apt-get 工具下载相应内核版本的源码。确保您已经安装了 linux-source 包。

sudo apt-get update
sudo apt-get install linux-source

此命令将下载并解压缩内核源码,存储在 /usr/src 目录中。

进入源码目录:
进入 /usr/src 目录,您将在其中找到解压缩后的内核源码目录。

cd /usr/src

创建符号链接:
为了使内核源码目录更易于访问,您可以创建一个符号链接。请将 <version> 替换为您上面记下的内核版本号。

sudo ln -s linux-source-<version> linux

这将创建一个名为 linux 的符号链接,指向内核源码目录。

现在,您就可以在 /usr/src/linux 中找到相应版本的内核源码。请注意,如果需要进行内核模块的编译和调试,您可能还需要安装与当前内核版本匹配的 linux-headers 包。

安装完内核后:进入/usr/src中查看下载好的源码文件,终端输入:tar xvjf linux-source-4.15.0.tar.bz2 -C /home/kernel

将文件解压到/home/kernel目录下。

报错:tar: /home/kernel:无法 open: 没有那个文件或目录
tar: Error is not recoverable: exiting now

自己在/home下创建一个kernel目录即可。

整个显示界面大致分为三部分,上方是操作的说明和图例说明。

<Enter> 按下Enter键进入子菜单。

<Y> 按下Y键,选中这项功能。

<N> 按下N键,排除这项功能 。

<M> 按下M键,以模块的形式选择。

<Esc><Esc> 按两下Esc键,返回上一级菜单

<?> 按下?键,查看高亮功能的帮助信息

</> 按下/键,搜索

[*] 被选中的项目

[ ] 未被选择的项目

<M> 以模块形式被选择的项目

< > 未被选择的模块

5. menuconfig 功能简述 — [野火]OpenWrt用户手册—基于LubanCat-RK系列板卡 文档

重新在内核配置中启用调试信息: 在内核配置中,确保启用了调试信息。可以通过以下步骤来配置内核:

在配置菜单中,选择:

Kernel hacking -->Compile-time checks and compiler options -->[*] Compile the kernel with debug info

构建内核: 重新构建内核以包括新的调试信息。

make -jX

使用使用 nproc 命令查看CUP内核数目,还可以使用 lscpu 命令来获取有关 CPU 的详细信息。

其中 X 是您系统上可用的 CPU 核心数量。然后安装新的内核。

make modules_install
make install

运行命令make modules_install报错:make: *** 没有规则可制作目标“modules_install”。 停止。

重启系统:
选择新内核并重启系统。

加载内核模块:
加载您的内核模块。

insmod your_module.ko

为 GDB 启用调试符号:
在构建内核模块时,确保生成了包含调试信息的模块文件。这通常是 .ko 文件,但可能具有调试信息的 .ko 文件会有一个 .debug 扩展。

用 GDB 调试:
打开 GDB 并加载内核模块文件:

gdb /path/to/vmlinux

在 GDB 中运行以下命令:

target remote :<port>

其中 <port> 是用于内核调试的端口。

add-symbol-file /path/to/your_module.ko <load-address>

其中 <load-address> 是您加载模块时报告的地址。

然后,您可以在 GDB 中设置断点、单步执行等操作。

请注意,调试内核模块可能涉及到很多特定于内核的调试技巧,具体取决于您的内核版本和配置。确保查阅相关的内核文档和 GDB 文档以获取更多详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-04(入门基础篇4——lists相关的部分语法)

python-04&#xff08;入门基础篇4——lists相关的部分语法&#xff09; 1. 前言1.1 python入门1.2 参考官网 2. 关于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新项 4. 列表是可变类型4.1 更改其中某元素内容4.2 使用切片更改列表大小…

Android 等待view 加载布局完成 (包括动态生成View)

前言 在实际开发中&#xff0c;有很多组件需要 根据数据&#xff0c;动态生成&#xff0c;或者 追加 / 减少 子view&#xff0c;由于View布局需要时间&#xff0c;此时想要获取父View的最新宽高值&#xff0c;要么手动测量&#xff0c;要么等待布局完成后再获取&#xff1b; …

《Android编程权威指南》之第二个activity源码及挑战

文章目录 前言效果图依赖MainactivityKotlin的“ &#xff1f;”kotlin的符号 QuizViewModelQuestion类CheatActivityonBackPressed()companion CheatViewModelstring.xml 前言 实现禁止一题多答&#xff0c;按题记录作弊状态、偷看次数限制、横竖屏切换依旧保存状态数据 个人…

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

在线教育小程序正在成为教育行业的新生力量

教育数字化转型是目前教育领域的一个热门话题&#xff0c;那么到底什么是教育数字化转型&#xff1f;如何做好教育数字化转型&#xff1f; 教育数字化转型是利用信息技术和数字工具改变和优化教育的过程。主要特征包括技术整合、在线学习、个性化学习、大数据分析、云计算、虚拟…

基于HSV空间色彩的图像分割方法(含python代码实现)

文章目录 1. 介绍2. HSV颜色空间3. python实现HSV图像分割3.1. 代码实现3.2. 运行结果 1. 介绍 HSV颜色系统简介&#xff1a; HSV 即使用色相&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;、明度&#xff08;Value&#xff09;来表示色彩的一种方式…

贝锐花生壳3大安全能力,保障网络服务安全远程连接

在没有公网IP的情况下&#xff0c;使用内网穿透工具&#xff0c;将本地局域网服务映射至外网&#xff0c;虽然高效快捷&#xff0c;但信息安全也是不可忽略的方面。 对此&#xff0c;贝锐花生壳提供了多维度的安全防护能力&#xff0c;满足不同场景下用户安全远程访问内网服务的…

uniapp 数组添加不重复元素

一、效果图 二、代码 //点击事件rightBtn(sub, index) {console.log(sub, index)//uniapp 数组添加不重复元素if (this.selectList.includes(sub.type)) {this.selectList this.selectList.filter((item) > {return item ! sub.type;});} else {this.selectList.push(sub.t…

cache 2.单机并发缓存

0.对原教程的一些见解 个人认为原教程中两点知识的引入不够友好。 首先是只读数据结构 ByteView 的引入使用是有点迷茫的&#xff0c;可能不能很好理解为什么需要ByteView。 第二是主体结构 Group的引入也疑惑。其实要是熟悉groupcache&#xff0c;那对结构Group的使用是清晰…

销售技巧培训之如何提高手机销售技巧

销售技巧培训之如何提高手机销售技巧 随着科技的迅速发展&#xff0c;手机已成为我们日常生活中不可或缺的一部分。作为一名手机销售员&#xff0c;了解手机销售技巧是必不可少的。本文将通过案例分析与实践&#xff0c;为你揭示手机销售的奥秘。 一、了解客户需求 在销售过程…

CRM系统选择技巧,什么样的CRM系统好用?

SaaS行业发展迅速&#xff0c;更多的企业逐渐选择CRM管理系统。打开搜索引擎&#xff0c;有非常多的结果。怎样在数十万个搜索结果中选择适合您的CRM系统&#xff1f;下面我们将聊聊&#xff0c;怎样选择CRM系统。 第一步&#xff1a;明确自身需求 重要性&#xff1a;每家企业…

【Java Web学习笔记】5 - XML

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml 零、在线文档 XML系列教程 一、XML引出 1.为什么需要XML 1.需求1 :两个程序间进行数据通信? 2.需求2:给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去…

JUnit 之初体验

文章目录 1.定义2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.样例0&#xff09;前提1&#xff09;测试类2&#xff09;测试方法3&#xff09;测试断言4&#xff09;实施 总结 1.定义 JUnit 是一个流行的 Java 单元测试框架&a…

初识 pytest 及断言使用

章节目录&#xff1a; 一、pytest 相关概述二、环境搭建三、使用前提四、断言4.1 常用断言4.2 异常断言4.3 断言装饰器 五、结束语 一、pytest 相关概述 pytest 是一个基于 Python 编写的测试框架&#xff0c;用于编写和运行各种类型的软件测试。它提供了丰富的功能和灵活的语法…

Vue:绘制图例

本文记录使用Vue框架绘制图例的代码片段。 可以嵌入到cesium视图中,也可以直接绘制到自己的原生系统中。 一、绘制图例Vue组件 <div v-for="(color, index) in colors" :key="index" class="legend-item"><div class="color-…

机器学习中的特征工程

1 特征工程概述 特征工程是机器学习中的一个关键步骤&#xff0c;在机器学习领域中占有非常重要的地位&#xff0c;是机器学习中不可或缺的一部分&#xff0c;下图展示了一个常规的机器学习流程&#xff1a; 特征工程涉及从原始数据中提取、选择和转换特征&#xff0c;以改善模…

计算机网络TCP篇②

来源自小林Coding博客&#xff0c;阅读后部分精简笔记 目录 一、TCP 重传、滑动窗口、流量控制、拥塞控制 1.1、重传机制 1.1.1、超时重传 1.1.2、快速重传 1.1.3、SACK 方法 1.1.4、Duplicate SACK 1.2、滑动窗口 1.3、流量控制 1.3.1、操作系统缓冲区与滑动窗口的关…

13、pytest为失败的断言定义自己的解释

官方实例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…

【数据结构第 6 章 ②】- 图的存储结构(详解邻接矩阵)- 用 C 语言实现

目录 一、邻接矩阵表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【数据结构第 6 章 ① 】- 图的定义和基本术语-CSDN博客 由于图的结构比较复杂&#xff0c;任意两个顶点之间都可能存在联系&#xff0c;因此无法以数据元素在存储区中的物理位置来表示元素之间的关系&…

Leetcode2477. 到达首都的最少油耗

Every day a Leetcode 题目来源&#xff1a;2477. 到达首都的最少油耗 解法1&#xff1a;贪心 深度优先搜索 题目等价于给出了一棵以节点 0 为根结点的树&#xff0c;并且初始树上的每一个节点上都有一个人&#xff0c;现在所有人都需要通过「车子」向结点 0 移动。 对于…