【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)

Linux环境下gdb程序调试 阅读详情

目录

一、前言 

二、什么是GDB 

 💦何为调试

 💦GDB调试工具---提供的帮助

 三、GDB的安装教程

 💦检查机器上是否安装了gdb

 💦gdb的安装

 四、GDB在那个开发版本(debug / release)中进行应用呢?

 💦看看gdb如何使用

 💦【Debug版本】与【Release版本】的区别

 💦Linux中开发环境的转换

 💦总结

五、使用GDB调试代码----指令学习

💦 指令集汇总 

💦指令演示

✨行号显示 

 ✨断点设置

 ✨查看断点信息 

 ✨删除断点 

 ✨开启 / 禁用断点

 ✨运行 / 调试

 ✨逐过程和逐语句 

 ✨ 打印 / 追踪变量

 ✨ 查看函数调用

 ✨ 修改变量的值

 💦最常用指令(指令三剑客)

 ✨指定行号跳转

 ✨强制执行函数

 ✨跳转到下一断点 

 六、GDB调试的实战演练

 七、总结

 八、共勉


一、前言 

        GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于以后想称为一个Linux下工作的c/c++程序员,GDB是必不可少的工具,所以本篇来从零讲解GDB在LInux的调试。

        对于GDB调试器来说,不像VS编译器中那样的图形化界面形式,而是采用纯命令行的形式进行调试。so 在开始学习的时候,大家可能会感觉晦涩难懂,但是这是C/C++程序员必须要掌握的技能,所以我将手把手进行零基础的讲解,本篇以C语言来讲解和调试。

二、什么是GDB 

        GDB 是由 GUN 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多 类Unix系统的标准开发环境。

 💦何为调试

 ⭐调试: 就是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。帮助我们发现代码中的错误,改进代码。

 💦GDB调试工具---提供的帮助

 一般来说,GDB 主要能够提供以下四个方面的帮助:

  • 程序启动时,可以按照自定义的要求运行程序,例如设置参数和环境变量;
  • 可以让被调试的程序在所指定的代码处暂停运行,并查看当前运行状态 (例如当前变量的值,函数的执行结果),即支持断点调试
  • 当程序被停住时,可以检查当前程序的中的变量的状态;
  • 在程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误

 三、GDB的安装教程

 在CentOS7 下安装 GDB

 💦检查机器上是否安装了gdb

rpm -qa | grep gdb

若没有反应,则没有安装,进行下一步

 💦gdb的安装

sudo yum install -y gdb

 四、GDB在那个开发版本(debug / release)中进行应用呢?

 💦看看gdb如何使用

 下面是本次调试所要使用到的代码:

  1 #include <stdio.h>
  2 
  3 int AddToTop(int top)
  4 {
  5     printf("Enter AddToTop\n");
  6 
  7     int count = 0;
  8     for(int i = 1;i <= top; ++i)
  9     {
 10        count += i;
 11     }
 12 
 13     printf("Quit AddToTop\n");                                                                         
 14     return count;
 15 }
 16 
 17 int main(void)
 18 {
 19     int top = 10;
 20     int ret = AddToTop(top);
 21 
 22     printf("ret = %d\n", ret);
 23     return 0;
 24 }

下面是Makefile中的内容,用于自动化编译:

  1 mytest:test.c
  2     gcc -o mytest test.c -std=c99                                                                      
  3 .PHONY:clean
  4 clean:
  5     rm -rf mytest

注:-std=c99表示以c99的标准来编译代码


  • 如果要进入gdb开始调试,那直接gdb + 可执行程序即可
  • 不过进去之后发现似乎有一些奇怪的内容,【no debugging symbols found】,翻译过来就是没有调试信息。那这是为何呢?是gdb出问题了吗?

  • 先不要着急,如果有经常调试的同学就可以知道只有在【DeBug】的环境下才会有我们想要的调试信息,所以可以初步推断这可能不是一个【DeBug】版本的可执行程序
  • 先使用q(quit)退出gdb


让我们先看下去,了解一下其他的知识再来解决这个问题
 

 💦【Debug版本】与【Release版本】的区别

接下去我们就来说说有关【DeBug】和【Release】版本的不同之处
📚【Debug】—— 调试版本
📚【Release】—— 发布版本

  • 在使用 VS 的时候我们可以直接使用鼠标来进行操作,当前程序以DeBug或者是Release的形式进行运行,那么运行出来的可执行程序版本也是不同的,我们程序员在编写代码后运行一般是使用【DeBug】环境进行运行。因为在企业里写软件项目,将代码写完后程序员自己要做简单的测试,保证代码没有问题

  • 当程序员自己测试完没有问题之后,就会将这个可执行程序给到测试人员进行测试,而且会给出自己的单元测试报告。对于测试人员来说所处的模式是【Release】,也就是将来客户要使用的这款软件的发布版本
  • 当测试在测的过程中,一定会发现一些问题。此时测试人员就会把报告再打回研发部。研发部做修改重新生成Release版本的可行性程序给到测试人员继续测试
  • 最后只有当测试通过了,再将生成的【单元测试报告】与产品经理进行核对之后没有问题,那这个软件才可以真正地面向市场👉

 💦Linux中开发环境的转换

        其实对于我们刚才直接make自动化生成的可执行程序是通过gcc直接编译产生得到的,它是一个【Release】版本的可执行程序,因此无法进行调试。

  • 若是我们想要使用gcc/g++去生成一个可执行程序时,默认是【Release】版本的,而不是【DeBug】
  • 但若是我们想要去生成一个【DeBug】版本的可执行程序也是可以的,只需要修改一下我们的Makefile即可,给gcc后面带上一个-g的命令选项,此时再去make一下的话生成的就是【DeBug】版本的了

  • 为了之前的【Release】版本不被覆盖,我们将其重命名一下为mytest-release
  • 在生成【DeBug】版本后一样对其进行一个重命名为mytest-debug

  • 通过观察上图中两个可执行文件的大小便可以发现虽然它们都是可执行程序,但是容量大小却不一样,这是为什么呢❓

⚡ :因为以Release版本发布的软件是给客户的,客户是不需要调试信息的
⚡ :往可执行程序里添加很多的调试信息意味着软件的体积会变大

  • 一方面,用户下载需要时间了
  • 另一方面,用户下载好之后将软件启动、运行都需要更多的时间,体验不好。一般能不加就不加

⚡ :但是对于DeBug来说会自动加调试信息,容量体积比Release大
 

 💦总结

⚡ :程序的发布方式有两种,debug模式和release模式
⚡ :Linux gcc/g++出来的二进制程序,默认是release模式
⚡ :要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项

五、使用GDB调试代码----指令学习

💦 指令集汇总 

因为这个调试器是在Linux环境下的,是纯命令行模式,所以会有很多的指令,做好心里准备😢

注:()括号里面是该指令的全称 
💜  l(list) 行号/函数名 —— 显示对应的code,每次10行

💜r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】

💜b(breakpoint) + 行号 —— 在那一行打断点

💜b 源文件:函数名 —— 在该函数的第一行打上断点

💜b 源文件:行号 —— 在该源文件中的这行加上一个断点吧

💜info b —— 查看断点的信息
breakpoint already hit 1 time【此断点被命中一次】
💜d(delete) + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】

  • 若当前没有跳出过gdb,则断点的编号会持续累加

💜d + breakpoints —— 删除所有的断点

💜disable b(breakpoints) —— 使所有断点无效【默认缺省】

💜enable b(breakpoints) —— 使所有断点有效【默认缺省】

💜disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】

💜enable b(breakpoint) + 编号 —— 使一个断点有效【开启断点】

  • 相当于VS中的空断点

💜enable breakpount —— 使一个断点有效【开启断电】

💜n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】

💜s(step) —— 逐语句【相当于F11,】

💜bt —— 看到底层函数调用的过程【函数压栈】

💜set var —— 修改变量的值

💜p(print) 变量名 —— 打印变量值

💜display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】

💜undisplay + 变量名编号 —— 取消对先前设置的那些变量的跟踪

排查问题三剑客🗡
💜until + 行号 —— 进行指定位置跳转,执行完区间代码

💜finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令

💜c(continue) —— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】

💦指令演示

        看了上面的这些命令后,相信你一定回到了刚开始学习Linux指令的时候那种恐惧感,不过没关系,我会一一地演示这些指令,让你在看完本文后有一个基本的调试能力💪

 
  • 首先我们进入到gdb,然后它会等待我们输入指令


 

✨行号显示 

 l(list) 行号/函数名 —— 显示对应的code,每次10行

  • 首先若是直接【L】的话便会随机显示出该源文件中的随机10行内容,这不是我们想要的

  • 若是【L 0】或者是【L 1】的话那就是从第一行开始往下列10行的内容
    • 注意这里的L是小写,而且与数字之间要有一个空格

  • 接下去若是想要看到我们所写的全部代码,只需要多Enter几次就可以了,gdb会自动记忆你上次敲入的指令

 ✨断点设置

 b + 行号 —— 在那一行打断点

b 源文件:函数名 —— 在该函数的第一行打上断点

b 源文件:行号 —— 在该源文件中的这行加上一个断点

 ✨查看断点信息 

 info b —— 查看断点的信息

  • 若是直接执行【info】的话,出来的就是所有的调试信息

  • 但若是我们只想查看一下所打的断点的信息,那就在后面加个b/breakpoint

  • 接下来简要介绍一下断点的一些字段信息
  • Num —— 编号
  •  Type —— 类型
  •  Disp —— 状态
  •  Enb —— 是否可用
  •  Address —— 地址
  •  What —— 在此文件的哪个函数的第几行

  • 最后的话就是每个断点信息的下面这块breakpoint already hit 1 time即此断点被命中1次

✨删除断点 

d + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】

d + breakpoints —— 删除所有的断点

  • 此时若继续将这个20行的断点打上时,就可以发现其编号为【4】,而并不是从1开始,这是因为我们没有退出过gdb,所以会持续上一次的编号继续往下

 ✨开启 / 禁用断点

 disable b(breakpoints) —— 使所有断点无效【默认缺省】

enable b(breakpoints) —— 使所有断点有效【默认缺省】

disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】

enable b(breakpoint) + 编号 —— 使一个断点有效【开启断点】

 ✨运行 / 调试

r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】

  • 首先若是将断点删除掉,使用【r】指令运行的话就会直接运行到程序结束

  • 再加上断点去运行的话就会在打的断点处停下来

✨逐过程和逐语句 

 n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】

  • 可以看到,我从第一个断点处也就是20行的位置开始执行,按下【n】之后因为在其后即22行有一个断点,此时就会直接运行到断点处

s(step) —— 逐语句【相当于F11,一次走一条代码,可进入函数,同样的库函数也会进入】

  • 此时我们按下【s】,也就相当于是【step】,让程序一步一步地走,继而进入了Addtop这个函数,若是你在printf()语句要执行时按下【s】的话gdb就会进入printf()库函数内部去执行,这里就不展示了

  • 接下去我们可以就继续【n】,然后进行逐过程调试,来到for循环中,那么逐过程也就是变量i的累加和计数器count的累加,所以会反复执行(通过图中最左侧可以看出是第8行和第10行在反复执行)
  • 可以看到后面我没有再按【n】了,但是依旧会执行上面的步骤,这点上面也有提到过,因为gdb会自动化记忆你上一次执行过的命令,所以若是不想再敲了,直接Enter就可以了

✨ 打印 / 追踪变量

p(print) 变量名 —— 打印变量值

  • 都执行了那么多次了,不知道【i】和【count】发生了怎样的变化,将它们打印出来看看吧💻

  • 通过继续执行【n】,然后再去打印就可以发现i的值和count的值发生了变化


但是你不觉得这样每次去打印会显得很繁琐吗,那一定会的,所以我们有更好的办法💡

display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】

  • 我们也可以去追踪一下这两个变量的地址,不过可以看到对于地址来说是不会发生改变的


undisplay + 变量名编号 —— 取消对先前设置的那些变量的跟踪

  • 但是呢,每次都追踪打印这么多内容又太多了,我想把它们取消了可以吗?答:当然是可以的
  • 既然有display,那就有undisplay

✨ 查看函数调用

bt —— 看到底层函数调用的过程【函数压栈】

  • 通过仔细观察刚才追踪的4个变量最左侧的编号,就可以看到它们的排列的顺序是倒着的。因为变量i和变量count是我们先追踪的,它们的地址是我们后追踪的,所以可以看出这很像是一个压栈的过程

  • 其实不仅是对于它们,Addtop函数和main函数也呈现这样的关系。此时我们就可以通过【bt】这个指令来查看函数压栈的过程,此时便可以看到因为

✨ 修改变量的值

set var —— 修改变量的值

  • 对于这个修改变量的值,很像是在VS里调试之前设置的那种条件断点,可以使调试开始后直接运行到此断点处。不过对于【set var】而言是在调试过程中进行设置

 💦最常用指令(指令三剑客)

掌握了上面的这些,你就可以在Linux下调一些简单的代码了,不过想做到高效地进行调试,就需要学习一下【三剑客】 

 ✨指定行号跳转

until + 行号 —— 进行指定位置跳转,执行完区间代码

  • 可以看到,当前在for循环内容执行累加的逻辑,但若是我们一直这么执行下去,就没有时间排错了,除了上面的哪一种【set var】之外,还有一种方法其实起到直接结束当前循环的作用,那就是进行指定行号跳转
  • 通过观察下图可以看到,当我们运行了until 13之后,程序直接就给出了我们最终的结果count,而且即将要执行最后的打印语句,说明我们跳转成功了

 ✨强制执行函数

finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令

  • 有时候我们会有这样的需求,在初步排查的时候推断可能是某个函数内部的逻辑出了问题,但是呢又不想一步步地进到函数内部进行调试,在VS中其实很简单,只需要在函数下方设个断点,然后F5直接运行到断点处即可
  • 但是在Linux下的gdb中,我们可以使用【finsh】指令来直接使一个函数执行完毕。从下图我们可以看到,首先【s】进到函数内部,接下去我直接使用finish,可以看到它直接回到了调用函数的位置,returned了一个返回值

  • 然后可以看到,在获取到返回值后,也就直接进行了printf打印

 ✨跳转到下一断点 

c(continue) —— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】

  • 这点也是我刚才在上面有提到过的,在VS中,我们要直接跳转到下一个断点处只修要按下F5即可,那在gdb中该如何操作呢,你需要敲个【c】就可以了
  • 从下图我们可以看出,对于这个指令的用处可谓是非常大,当我处于第一个断点也就是20行的时候,直接敲下【c】,就可以运行到第二个断点处也就是第10行。之后若反复敲【c】,因为这是一个单语句的循环,所以循环的下一次还是会执行到此处。上面的这两个功能就和我们在VS中用的F5是一个道理

 六、GDB调试的实战演练

 📖纸上得来终觉浅,绝知此事要躬行🔨

以下是本次调试所要使用到的代码,相信你一定非常熟悉了,也就是使用指针交换两数

  1 #include <stdio.h>
  2 
  3 void swap(int* x, int* y)
  4 {
  5     int t = *x;
  6     *x = *y;
  7     *y = t;                                                                                            
  8 }
  9 int main(void)
 10 {
 11     int a = 10;
 12     int b = 20;
 13 
 14     printf("a = %d, b = %d\n", a, b);
 15 
 16     swap(&a, &b);
 17 
 18     printf("a = %d, b = %d\n", a, b);
 19     return 0;
 20 }

首先先来看一下运行后的结果:

接下里,我们进入GDB 调试模式,看看它们是如何交换的。

  • 首先我们在程序第16行设置上一个断点,然后【r】从第15行开始运行

  • 然后我们使用【s】进入到swap函数中,因为我首先不想调试,想先立马看看运行结果,但是此时又已经进入调试了,那么我们就可以使用到【finish】来立马执行完这个函数,然后观察一下结果
  • 可以看到,最后打印出结果的时候a和b的值确实发生了交换

  • 既然清楚了二者会进行一个交换,接下去我们就逐语句【n】进行一个单步追踪吧
  • 因为提前看了执行结果,所以我们要重新开始调试,按下【r】即可,它会询问你是否需要重新开始调试,选择y之后就可以重新从16行开始进行调试

  • 首先通过【display】记录一下两个变量的值和地址

  • 接着按【s】进入到swap函数里,追踪一下指针x和指针y的内容,也就是它们所存放的地址,就可以看到,函数内部已经接受到了这两个变量的地址

  • 然后对我们要观察的值变化继续做一个追踪
  • 并且在执行完第一个语句t = *x时,临时变量t中已经存放了变量a的值,也就是指针所指向的那块空间中的值

  • 接下去执行*x = *y,此时*x中的值就发生了变化,因为指针x可以直接找到变量a的地址,所以可以对其中的内容做修改,就变为了20

  • 接下去执行*y = t,同理,指针y可以直接找到变量b的地址,所以可以对其中的内容做修改,将原本保存在临时变量t中的10赋值给到*y,也就修改了其中的内容

  • 再按【n】的话这个swap函数就执行结束了,回到了main函数,就可以清楚地看到函数内部的修改带动了函数外部值的变化,真正地通过【传址调用】交换了两个数

 

整体的调试结束!!!!

 七、总结

最后来总结一下本文所学习的内容📖

  •  在本文的开始,我们在初见GDB的时候发现了【no debugging symbols】的报错信息,于是便谈到了一个可执行程序的【DeBug】版本和【Release】版本,知道了对于前者来说是我们程序员使用的环境,是存在调试信息的;对于后者来说是测试人员所处的环境,是不存在调试信息的。而对于gcc/g++而言默认生成的可执行程序就是【Release】版本的,因此我们要加上一个-g命令选项使其在make之后生成一个【DeBug】版本的可执行程序,这样就可以进行调试了
  • 接着我们正式进入到了调试器GDB的使用,介绍了很多相关的指令,这些都是我整理出来的常见指令,其实对于GDB来说还有很多指令,但是真正常用的也就这些,只要你认真地看下来,将它们都使用熟练了,相信你的调试功底会大幅度提升,对你在VS中的调试也是有所帮助的
  • 最后,在学习了GDB的许多调试指令后,我们便进行了【Swap Two Numbers】的实战演练,不仅巩固了C语言中有关传址调用以及函数栈帧的相关指知识,而且使我们对于调试器GDB的使用更上一层楼↑

八、共勉

   以下就是我对【Linux基础】GDB调试器保姆级的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对【Linux基础】Linux环境开发 的理解,请持续关注我哦!!!  

C C++最新【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?(1),从入门到真香 ⚡ :程序的发布方式有两种, 阅读详情

相关推荐

Linux:GDB调试指南(什么是GDB?GDB如何使用?)

基于gcc的debug调试

m0_64392809的博客 1880

GDB调试工具

3、当程序被停住时,可以检查此时你的程序中所发生的事。4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序(按着自己的想法运行)。GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。2、可让被调试的程序在你所指定的调置的断点处停住。edit [file:]function查看停止的信息。step如果有函数,进入函数,查看函数里面的信息。print expr 打印输出。next一步一步运行。GDB调试正在运行的进程。

qq_43341187的博客 4316

Linux | 调试器GDB的详细教程【纯命令行调试】

见识过纯命令行的调试器吗?那就来看看GDB吧,会让你眼前一亮

做技术人 · 产优质博客 · 找好工作 1万+

GDB调试工具的使用方法详解【图文教程】

GDB(GNU Debugger)是一个功能强大的命令行调试工具,用于调试 C、C++ 等程序。它能够帮助开发者定位和修复程序中的 bug,查看程序状态、变量值以及函数调用堆栈。下面详细介绍 GDB 的使用方法和过程,并附上相应的代码示例。

qq_42037383的博客 3626

【GDB】一文掌握 GDB 详细用法(GDB 命令速查)

GDB(GNU Debugger)是Linux/Unix系统下强大的命令行调试工具,用于分析程序运行时的内存状态、执行流程和故障定位。就会被压入栈中,栈帧包含了该函数的局部变量、参数、返回地址和其他信息,当函数执行完毕后,这个栈帧会被弹出栈并销毁。调用的函数如果存在全局变量、静态变量的修改,在函数返回后会恢复到调用之前的值,这两个调用不会影响程序的状态。显示运行时将要或已经传递给程序的参数。每当一个函数被调用时,一个新的栈帧。在启动进程前,添加环境变量。在启动进程前,清除环境变量。连接到正在运行的进程。

数据知道的博客 1万+

【Linux】Linux下调试器gdb的使用

debug和release版本的认识、gbd指令集、图文演示gdb的使用

StackFrame 4470

【Linux】Linux工具——gdb

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

2301_80224556的博客 4249

解锁笔记智能对话:手把手配置 Obsidian Copilot 插件与硅基流动模型

本文详细介绍了如何为Obsidian笔记软件配置Copilot插件,并接入硅基流动AI模型,从而为个人知识库添加智能对话能力。通过手把手教程,指导用户完成插件安装、API Key获取、模型配置及索引构建,最终实现基于个人笔记内容的深度语义问答,提升知识管理效率。

corn8的博客 607

Linux笔记---调试工具GDB(gdb)

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

2302_80372340的博客 5447

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 6963

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 467

【Linux我做主】GDB调试工具完全指南

带你迅速上手GDB调试!!!

有梦想的电信狗 3341

Android 13/14/15 默认授权应用权限的实现方法

Android版本修改方式实现原理13/14修改Permission.java将所有权限标记为Normal权限15修改DeviceIdleController.java + DefaultPermissionGrantPolicy.java监听应用安装并主动授权。

m0_60898338的博客 2897

【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?

⚡ :程序的发布方式有两种,

2401_87021431的博客 1817

基于VLFM的中文指令视觉语言导航系统设计与实现

文章摘要 本文介绍了一个基于VLFM(视觉语言边界地图)的中文指令视觉语言导航系统设计与实现。该系统采用模块化架构,包含三维场景渲染、URDF机器人仿真、VLFM导航引擎、中文指令解析和PyQt图形界面五大核心模块。系统支持自定义GLB场景模型和URDF机器人模型,通过transformers和langchain实现中文自然语言指令解析,利用VLFM算法进行语义导航决策。技术实现上详细介绍了GLB模型加载器开发、URDF机器人控制、VLFM导航算法集成以及PyQt界面设计。该系统在Ubuntu环境下运行,依

AI的内部世界的博客 202

大数据领域存算分离:教育行业的数据应用探索

在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表;

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 808

【Linux】——调试器-gdb的使用

【Linux】——调试器-gdb的使用

m0_56069910的博客 4007

uniapp - 最新详细实现web-view网页与安卓苹果App端之间互相通信功能,苹果app/安卓app平台与内嵌webview组件内的网页进行相互传值,内置网页与app双向实时通信,详细示例代码

uni-app,Android安卓,苹果ios,app,内嵌webview,第三方H5网页,app和web-view通信传值,web-view引入的页面向App主应用传递数据,App端与webview端相互通信,App端和H5端webview之间的通信,uniapp实现webview和APP之间的传值通信,如何互相传递对象数据,数据传递了接收不到,web-view页面向app内发送消息,监听传递的参数,uni-app和web-view页面相互传参,报错怎么办,跨域,屏幕空白出错,数据交互,解决手机物理返回按

🏆 前端领域优质创作者 4732

【Linux】Linux下的调试器-gdb的使用

该博客讲了release和debug两个模式的区别,接着主要讲了如何在Linux下使用gdb调试代码,按照步骤一次操作,给出了操作图。最后给出了gdb操作的指令集,如果对gdb很熟悉可以直接使用该指令集查看,写的不好,各位大佬多多指点

m0_52094687的博客 3940

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 783

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

GDB - GDB保姆级调试教程(一)

GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于以后想称为一个Linux下工作的c/c++程序员,GDB是必不可少的工具,所以本篇来从零讲解GDB在LInux的调试。对于GDB调试器来说,不像VS编译器中那样的图形化界面形式,而是采用纯命令行的形式进行调试。so 在开始学习的时候,大家可能会感觉晦涩难懂,但是这是C/C++程序员必须要掌握的技能,所以我将手把手进行零基础的讲解,本篇以C语言来讲解和调试。

qq_41668395的博客 2435

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux下如何使用gdb启动调试

前言 GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具,本篇以C语言来调试。 GDB简介 UNIX及UNIX-like下的调试工具。虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,能够让用户在程序运行时观察程序的内部结构和内存的使用情况。 一...

chen1415886044的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux GDB 调试指南

课程亮点 三个维度介绍 GDB 调试中的技巧和注意事项 以时下流行的内存数据库 Redis 为示例对象 梳理开源软件项目结构和分析源码思路 课程背景 调试是程序开发和排障很重要的一个环节,对于从事 Linux C/C++ 后台开发的读者来说,GDB 调试是需要熟练掌握的一项技能。 有些读者可能想学习像 Redis、Apache Web Server、Nginx 等以 C/C++ 为主要开发语言...

GitChat 4808

【Linux】调试工具GDB的使用及案例讲解

GDB是Linux下一款强大的调试工具。GDB可以调试C、C++、Java等语言,对于在Linux下工作的程序员来说,GDB是必不可少的调试工具。本篇我将以c程序,进行调试和讲解当大家对指令比较熟悉时,gdb的使用还是比较简单的,以上是我个人,经常使用的命令,是对标VS下编译的调试功能来介绍的,如果这不能满足你的要求,可以搜一些更高级的用法。

2301_80774875的博客 1858

【Linux】Linux调试器-gdb使用

在前面的博客【Linux】编译器-gcc/g++使用已经分享了关于编译器的使用,而编译器的使用离不开调试,这次就来分享一下Linux调试器-gdb使用。

zxctsclrjjjcph的博客 1992

【Linux】gdb调试器的使用

GDB 全称“GNU symbolic debugger”,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go 等等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。

m0_65679465的博客 7396
上一篇: C++ 模板保姆级详解——template<class T>(什么是模板?模板分哪几类?模板如何应用?)
下一篇: C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)
sunny-ll
sunny-ll 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄7年 7882粉丝 155原创
评论 43
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值