【软件调试】gdb初识

GDB调试无行号,报dwarf error问题解决 的问题,网上很多资料说得很含糊,大多也都一知半解,真要深入研究,还是有很多坑的。一般出现在gcc编译环境版本与gdb调试环境版本不匹配导致,一般可以通过编译时指定dwarf版本解决除了我们自身的源码需要指定dwarf版本,程序所依赖的第三方库也需要使用指定的dwarf版本进行编译推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker, 阅读详情

1.学习链接

pstack使用和原理 

xiaofei0859的《编译链接》专栏-质量高

Linux程序分析工具介绍—ldd,nm

软件调试

推荐阅读1

GDB设置显示选项

一篇适合入门

写的非常好,全面

GDB调整动态库

GDB十个常用的命令

gdb官方学习文档链接

LINUX下GDB的使用方法(简单说说)

GDB基础和高级部分的内容都有的链接

引用阅读-写的超级好,就是排版有点乱,嘻嘻

gdb调试程序时跳进函数和跳出函数

多进程和多线程调试

超级好文

断点原理与实现

一次性打印出所有线程的堆栈信息

gdb用watch来追踪变量值的变化

2.gdb的一些参数

GDB 调试主要有三种方式:
1. gdb filename  直接调试目标程序
2. gdb attach pid 附加进程
3. gdb filename corename 调试 core 文件


finish --执行完当前函数并回到函数调用点(如果在循环体内执行,则执行完整个循环,不一定会执行完当前函数)
return --停止执行当前函数并回到函数调用点
thread apply all bt 一次性答应出所有线程的信息(或thr app all bt)

3.gdb的TUI

推荐链接1

GDB中的TUI的官方说明文档

4.GDB-COMMANDS

演示代码:
#include <stdio.h>


struct book {
  //   char a;
     char *name;
     int year;
     int price;
}bk;

static int func(int n){

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

static void modify_book(void)
{
     int i = 0;
     while(1){
             bk.name = "Linux device driver";
             bk.year = i;
             bk.price = i;
             i++;
             printf("%d\n",i);
             sleep(1);
    };
}

int main(int argc ,char **argv)
{
     int i;
     int result = 0;
     for(i = 1;i<=100;i++)
     {
         result +=1;
     }
     printf("result[1-100]=%d \n ",result);
     printf("result[1-250]=%d \n ",func(250));

     modify_book();// 假设此行设置了断点且运行到此处停下来了,如果此时在此处如果敲s的话,会进入这个函数里面执行;如果敲n的话,会将这句话执行完.

     return 0;

}



调试过程:
[root@localhost 0028-gdb]# gdb main.debug -q
Reading symbols from /home/muten/C/0028-gdb/main.debug...done.
(gdb) b 45
Breakpoint 1 at 0x401221: file 001-main.c, line 45.
(gdb) r
Starting program: /home/muten/C/0028-gdb/main.debug 
result[1-100]=100 
 result[1-250]=31125 

Breakpoint 1, main (argc=1, argv=0x7fffffffdb68) at 001-main.c:45
45	     modify_book();// 假设此行设置了断点且运行到此处停下来了,如果此时在此处如果敲s的话,会进入这个函数里面执行;如果敲n的话,会将这句话执行完.
Missing separate debuginfos, use: debuginfo-install glibc-2.17-317.el7.x86_64
(gdb) s【单步运行】
modify_book () at 001-main.c:23
(gdb) layout src
(gdb) bt【查看函数调用信息(堆栈)】
#0  modify_book () at 001-main.c:23
#1  0x0000000000401226 in main (argc=1,	argv=0x7fffffffdb68) at 001-main.c:45
(gdb) p	bk【查看bk的值】
$1 = {name = 0x0, year = 0, price = 0}
(gdb) p	bk.year=2010【将bk.year的值改成2010】
$2 = 2010
(gdb) p	bk【再次查看bk的值】
$3 = {name = 0x0, year = 2010, price = 0}
(gdb) p	&bk【查看结构体的基地址】
$4 = (struct book *) 0x404050 <bk>
(gdb) x/3w 0x404050
0x404050 <bk>:	0	0	2010
(gdb) x/8w 0x404050
0x404050 <bk>:	0	0	2010	0
0x404060:	0	0	0	0
(gdb) x/16w 0x404050
0x404050 <bk>:	0	0	2010	0
0x404060:	0	0	0	0
0x404070:	0	0	0	0
0x404080:	0	0	0	0
(gdb) x/16x 0x404050【以16进制(x)看以0x404050为起始地址的16个word的地址】
0x404050 <bk>:	0x00000000	0x00000000	0x000007da	0x00000000
0x404060:	0x00000000	0x00000000	0x00000000	0x00000000
0x404070:	0x00000000	0x00000000	0x00000000	0x00000000
0x404080:	0x00000000	0x00000000	0x00000000	0x00000000
0x404050 <bk>:	0x00000000	0x00000000	0x000007da	0x00000000
0x404060:	0x00000000	0x00000000	0x00000000	0x00000000
(gdb) set *(int*)0x404058=2019【更改0x404058处对应的int类型的变量的值】
(gdb) p	bk
$3 = {name = 0x0, year = 2019, price = 0}
继续运行,之后CTRL+C,TUI中看不到源码的时候说明函数进内核态了,TUI显示的代码是运行的代码,
此时运行bt
(gdb) bt                                                                                                                                                     Line: 24   PC: 0x4011c3 
#0  0x00007ffff7ad2840 in __nanosleep_nocancel () from /lib64/libc.so.6
#1  0x00007ffff7ad26f4 in sleep () from /lib64/libc.so.6
#2  0x00000000004011c3 in modify_book () at 001-main.c:30
#3  0x0000000000401226 in main (argc=1,	argv=0x7fffffffdb68) at 001-main.c:45
(gdb) finish【将#0运行完】
Run till exit from #0  0x00007ffff7ad2840 in __nanosleep_nocancel () from /lib64/libc.so.6
0x00007ffff7ad26f4 in sleep () from /lib64/libc.so.6
(gdb) finish【将#1运行完】
Run till exit from #0  0x00007ffff7ad26f4 in sleep () from /lib64/libc.so.6
modify_book () at 001-main.c:24
(gdb) bt
#0  modify_book () at 001-main.c:24
#1  0x0000000000401226 in main (argc=1,	argv=0x7fffffffdb68) at 001-main.c:45
(gdb) watch bk.year
Hardware watchpoint 2: bk.year

一些图片:

5.strace+addr2line调试

strace+addr2line调试
strace 是一个集诊断、调试、统计与一体的工具,我们可以使用strace,对应用的系统调用和信号传递的跟踪结果,来对应用进行分析,以达到解决问题,或者是了解应用工作过程的目的。

strace 的简单的用法就是,执行一个指定的命令,在指定的命令结束之后,它也就退出了。
在命令执行的过程中,strace 会记录和解析命令进程的所有系统调用,以及这个进程所接收到的,所有的信号值。

-c ,统计每一系统调用的所执行的时间,次数和出错的次数等
-p ,指定进程pid
-i ,输出系统调用的入口指针

linux 下操作过程(省略部分加载信息):
strace -i ./a.out 找到段错误的地址
addr2line -e a.out 地址

GDB远程调试 gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。要用gdb调试程序,必须在编译时加上-g和-ggdb选项,如果没有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。 阅读详情

相关推荐

手把手教你用Excel自动化处理G14大额风险暴露报表(含211版模板)

本文针对G14大额风险暴露报表(含211版)手工填报效率低、易出错的核心痛点,提供了一套基于Excel VBA的完整自动化解决方案。文章详细讲解了如何构建从数据采集、清洗、关联客户识别、风险暴露计算到自动化校验与归档的完整工作流,并附有可操作的代码示例,旨在帮助银行风控人员大幅提升报表处理效率与准确性。

weixin_29304985的博客 450

gdb调试报错:Missing separate debuginfos

在centos7上面gdb调试程序时候,报错信息是:Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.5.x86_64 解决方案:1 先修改"/etc/yum.repos.d/CentOS-Debuginfo.repo"文件的 enable=1;有时候该文件不存在,则需要手工创建此文件并加入以下内容: ...

weixin_34278190的博客 607

家庭路由器从入门到精通:连接设置、优化排障全指南

路由器作为家庭网络的核心枢纽,其工作原理基于NAT(网络地址转换)和DHCP(动态主机配置协议)两大关键技术。NAT负责将公网IP转换为多个内网IP,实现多设备共享上网;DHCP则自动为接入设备分配IP地址,简化网络配置。这些技术共同构建了稳定、安全的局域网环境,其价值在于为智能家居、在线办公、高清影音和游戏娱乐等场景提供可靠的网络基础。理解路由器的物理连接、后台设置与故障排查逻辑,是优化Wi-Fi信号覆盖、提升网络性能、保障家庭网络安全的关键。本文以路由器配置与排障为核心,详细解析从WAN/LAN口区分、

weixin_33393017的博客 406

gdb中run出现的Missing separate debuginfos, use: debuginfo-install glib

问题: Missing separate debuginfos, use: debuginfo-install glib 解决方法: 1、将/etc/yum.repo.d/CentOS-Debuginfo.repo中的enable改为1 debuginfo-install glibc 出现错误 command not found 2、debuginfo-insta...

weixin_34146805的博客 330

DC/DC开关电源EMC仿真红宝书

本红宝书系统性介绍开关电源EMC仿真方法,包括仿真原理、仿真思路、仿真工具以及仿真效率提升与仿测一致性的实战经验。从理论到仿真,从仿真到应用,真正帮你实现一文掌握开关电源EMC仿真!全文约14000字,适读人群:开关电源设计、电磁兼容EMC相关从业者,电磁相关专业研究生及CST仿真爱好者等。

电磁学社 2502

在ubuntu上安装FastSufer【本机安装】

其实说是安装,只需要将文件下载并解压即可。推荐教程注意版本:在下面这个网址根据你的操作系统找到最新的版本安装。比如我的操作系统为Ubuntu 20.04.5,因此我安装ubuntu20-7.4.1的freesurfer打开~/.bashrc在~/.bashrc文件中添加以下三行关闭~/.bashrc更新~/.bashrc安装tcsh注意每次进入终端使用freesurfer时需要输入FREESURFER_HOME路径根据freesurfer的文件夹所在位置自己修改。

Xingwen_future的博客 2009

巧妙方法教你实现多种main()

截止到此,我们了解了整个main()函数的调用过程,但是,仍然没有回答二哥的问题,main()是如何实现有参和无参两种方式的,其实说白了,在标准中,main()只有一种声明方式,即有参方式。但是,作为一个开发老油条,也仅仅知道是这样做的,当看到二哥提出这个问题的时候,第一反应是重载,但是大家都知道C语言是不支持重载的,那么有没有可能使用的是默认参数呢?从上述gdb信息,我们看出main()位于栈顶,显然,我们的目的是分析main()的调用堆栈信息,而这种main()在栈顶的方式显然不足以解答我的疑问。

Free雅轩的博客 1548

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

在CentOS7下的gdb中run出现的Missing separate debuginfos, use: debuginfo-install

背景:试着在centos7里调试一下c程序,出现,Missing separate debuginfos, use: debuginfo-install cyrus-sasl-lib-2.1.26-17.el7.x86_64 glibc-2.17-78.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.12.2-14.el7.x86_6

ck4438707的博客 2980

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3780

大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅

Spring AI 是一个轻量级开源框架,旨在简化 AI 模型在企业级 Java 应用中的集成与管理。它提供了跨多个 AI 服务提供商的便携式 API,支持聊天、文本转图像、嵌入式模型等多种功能,并兼容主流的 AI 模型提供商如 OpenAI、Google 等。Spring AI 的核心功能包括结构化输出、向量数据库支持、工具/函数调用、可观察性、文档摄取 ETL 框架、AI 模型评估等。

寻道AI,探索AI无限可能! 6367

GDB调试命令详解

GDB是什么 调试程序 程序中出现的语法错误可以借助编译器解决;但逻辑错误则只能靠自己解决。实际场景中解决逻辑错误最高效的方法,就是借助调试工具对程序进行调试。 所谓调试(Debug),就是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。 也就是说,通过调试程序,我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低

Hello World 9万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

gdb调试详解

一、gdb调试coredump文件 二、gdb调试多线程       【Note】:

青萍之末的博客 1万+

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

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

GDB调试

转载至从 0 开始学习 Linux 系列之「08.15 个 gdb 调试基础命令」 此处仅想保存下来自己记录 gdb 简介 gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感,一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序,逼格瞬

小白的成长 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何使用GDB调试

文章目录一、GDB的介绍二、GDB的使用三、使用GDB调试实际例子 一、GDB的介绍 GDB(全称:GNU Debugger)是GNU工程为GNU操作系统开发的调试器。它可以用于调试C、C++、Objective-C、Pascal、Ada等语言编写的程序。 二、GDB的使用 GDB的使用条件 程序要用GDB调试,需要添加调试信息。 添加方法: gcc的-g选项为程序添加调试信息。 例如:gcc –g –o helloworld helloworld.c 启动GDB 启动方法: gdb [程序名称

Harriet的博客 6558

gdb调试小结

一、启动 1、gdb 2、调试在线进程 (1)启动gdb时链接目标进程 (2)gdb中链接目标进程: (3)断开链接: 二、信息显示 1、栈信息 2、变量 3、寄存器 4、内存 5、源代码 6、显示格式 三、断点 1、设置断点 2、 查看、删除断点 3、设置无效、有效断点: 4、条件断点 5、监视点 6、断点命令 四、其他 1、强制函数返回 2、强制调用函数 参考 ...

milletluo的博客 1万+

GDB调试指南

GDB是linux下非常好用且强大的调试工具,能够使让用户在程序运行的过程中观察内部结构与内存的使用情况,掌握gdb对于二进制pwn手的学习是入门的要求。不会进入调试界面,跟直接运行程序差不多这是pwntools用于在exp脚本方便调试的部分context.terminal = ["tmux","splitw","-h"]#产生左右分屏,不带的话是上下分屏比较难受gdb.attach() #放到想要在exp中停止的位置,程序在运行时候会停止在该处进行调试运行脚本得到注意:要在tmux模式下才可以。

qq_62531518的博客 2610

软件调试 · 工具类 · GDB调试基础操作

GDB是GNU项目的一个调试器,它允许开发者在程序执行时或崩溃时查看程序内部发生的情况。GDB的主要功能包括启动程序、在特定条件下停止程序、检查程序停止时的状态以及在程序中更改内容以实验修复错误。

m0_49927539的博客 1565

GDB调试大全

GDB详细调试大全

m0_60524373的博客 4126

C++调试@认识GDB调试

GDB(GNU Debugger)是Linux及Unix环境中常用的程序调试工具,windows 下也有许多移植版可以用深入理解程序执行:GDB命令行提供了对程序执行流程的底层控制,帮助你更深入地理解程序的运行机制。通过手动控制每一步执行,你能够更细致地观察变量变化、函数调用、内存状态等,这对于复杂问题的排查非常有帮助。轻量级和灵活性:相比IDE,GDB是一个轻量级工具,尤其适合远程服务器或资源受限环境下的调试。

xuchaoxin1375的博客 1368

gdb调试

命令名称命令缩写命令说明runr运行一个程序continuec让暂停的程序继续运行nextn运行到下一行steps如果有调用函数,进入调用的函数内部(相当于step intountilu运行到指定行停下来finishfi结束当前调用函数,到上一层函数调用处returnreturn结束当前调用函数并返回指定值,到上一层函数调用处jumpj将当前程序执行流跳转到指定行或地址printp打印变量或寄存器值backtracebt查看当前线程的调用堆栈。

m0_74186706的博客 2753

Linux GDB 调试指南

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

GitChat 4814
上一篇: 【TARS】基于TARS的调试
下一篇: 【软件调试】在Centos下安装dwarfdump
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值