100个GDB小技巧(一)

gdb实践(1): 进程CPU 100%排查 进程CPU 100%卡在那里没反应了,这时候没有coredump的文件分析,但可以通过强大的gdb调试。        下面写了一个简单的CPU 100%的死循环测试程序(t.c):                  编译运行,发现程序迟迟没有执行结束:                  使用top命令查看了一下,./a.out的可执行程序已经CPU 100%了: 阅读详情

本文是100个GDB小技巧阅读总结,100个GDB小技巧.

列出函数的名字

在这个例子中源代码如下:

#include <stdio.h>
#include <pthread.h>
void *thread_func(void *p_arg)
{
        while (1)
        {
                sleep(10);
        }
}
int main(void)
{
        pthread_t t1, t2;

        pthread_create(&t1, NULL, thread_func, "Thread 1");
        pthread_create(&t2, NULL, thread_func, "Thread 2");

        sleep(1000);
        return;
}

然后保存文件为fucntion.c
gcc -g function.c -o function提示如下错误:
/tmp/ccCIJDjs.o: In function main':
/root/function.c:14: undefined reference to
pthread_create’
/root/function.c:15: undefined reference to `pthread_create’
collect2: error: ld returned 1 exit status

错误产生的原因是:
pthread库不是标准linux库,修改为如下方式即可:
gcc -pthread -g function.c -o function
然后gdb function即可.

退出正在调试的函数

例子

#include <stdio.h>
int func(void)
{
    int i = 0;

    i += 2;
    i *= 10;

    return i;
}

int main(void)
{
    int a = 0;
    a = func();
    printf("%d\n", a);
    return 0;
}

技巧

当单步调试一个函数时,如果不想继续跟踪下去了,可以有两种方式退出。

第一种用“finish”命令,这样函数会继续执行完,并且打印返回值,然后等待输入接下来的命令。以上面代码为例:

(gdb) n
17      a = func();
(gdb) s
func () at a.c:5
5         int i = 0;
(gdb) n
7         i += 2;
(gdb) fin
find    finish
(gdb) finish
Run till exit from #0  func () at a.c:7
0x08050978 in main () at a.c:17
17        a = func();
Value returned is $1 = 20

可以看到当不想再继续跟踪func函数时,执行完“finish”命令,gdb会打印结果:“20”,然后停在那里。
第二种用“return”命令,这样函数不会继续执行下面的语句,而是直接返回。也可以用“return expression”命令指定函数的返回值。仍以上面代码为例:

(gdb) n
17          a = func();
(gdb) s
func () at a.c:5
5            int i = 0;
(gdb) n
7            i += 2;
(gdb) n
8            i *= 10;
(gdb) re
record              remove-inferiors    return              reverse-next        reverse-step
refresh             remove-symbol-file  reverse-continue    reverse-nexti       reverse-stepi
remote              restore             reverse-finish      reverse-search
(gdb) return 40
Make func return now? (y or n) y
#0  0x08050978 in main () at a.c:17
17          a = func();
(gdb) n
18          printf("%d\n", a);
(gdb)     40
19          return 0;

可以看到“return”命令退出了函数并且修改了函数的返回值。

打印函数堆栈帧信息

例子

#include <stdio.h>
int func(int a, int b)
{
    int c = a * b;
    printf("c is %d\n", c);
}

int main(void) 
{
    func(1, 2);
    return 0;
}

技巧
使用gdb调试程序时,可以使用“i frame”命令(i是info命令缩写)显示函数堆栈帧信息。以上面程序为例:
(gdb) b func
Breakpoint 1 at 0x4004d2: file main.c, line 4.
(gdb) r
Starting program: /root/play/main
Breakpoint 1, func (a=1, b=2) at a.c:5
5 printf(“c is %d\n”, c);
(gdb) i frame
Stack level 0, frame at 0x7fffffffe590:
rip = 0x40054e in func (a.c:5); saved rip = 0x400577
called by frame at 0x7fffffffe5a0
source language c.
Arglist at 0x7fffffffe580, args: a=1, b=2
Locals at 0x7fffffffe580, Previous frame’s sp is 0x7fffffffe590
Saved registers:
rbp at 0x7fffffffe580, rip at 0x7fffffffe588
(gdb) i registers
rax 0x2 2
rbx 0x0 0
rcx 0x0 0
rdx 0x7fffffffe688 140737488348808
rsi 0x2 2
rdi 0x1 1
rbp 0x7fffffffe580 0x7fffffffe580
rsp 0x7fffffffe560 0x7fffffffe560
r8 0x7ffff7dd4e80 140737351863936
r9 0x7ffff7dea560 140737351951712
r10 0x7fffffffe420 140737488348192
r11 0x7ffff7a35dd0 140737348066768
r12 0x400440 4195392
r13 0x7fffffffe670 140737488348784
r14 0x0 0
r15 0x0 0
rip 0x40054e 0x40054e

设置临时断点

#include <stdio.h>
#include <pthread.h>
typedef struct
{
        int a;
        int b;
        int c;
        int d;
        pthread_mutex_t mutex;
}ex_st;

int main(void) {
        ex_st st = {1, 2, 3, 4, PTHREAD_MUTEX_INITIALIZER};
        printf("%d,%d,%d,%d\n", st.a, st.b, st.c, st.d);
        return 0;
}

技巧

在使用gdb时,如果想让断点只生效一次,可以使用“tbreak”命令(缩写为:tb)。以上面程序为例:
(gdb) tb a.c:15
Temporary breakpoint 1 at 0x400500: file a.c, line 15.
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint del y 0x0000000000400500 in main at a.c:15
(gdb) r
Starting program: /data2/home/nanxiao/a
Temporary breakpoint 1, main () at a.c:15
15 printf(“%d,%d,%d,%d\n”, st.a, st.b, st.c, st.d);
(gdb) i b
No breakpoints or watchpoints.
首先在文件的第15行设置临时断点,当程序断住后,用“i b”(”info breakpoints”缩写)命令查看断点,发现断点没有了。也就是断点命中一次后,就被删掉了。

条件断点

#include <stdio.h>
int main(void)
{
        int i = 0;
        int sum = 0;

        for (i = 1; i <= 200; i++)
        {
            sum += i;
        }

        printf("%d\n", sum);
        return 0;
}

技巧
gdb可以设置条件断点,也就是只有在条件满足时,断点才会被触发,命令是“break … if cond”。以上面程序为例:
(gdb) start
Temporary breakpoint 1 at 0x4004cc: file a.c, line 5.
Starting program: /data2/home/nanxiao/a
Temporary breakpoint 1, main () at a.c:5
5 int i = 0;
(gdb) b 10 if i==101
Breakpoint 2 at 0x4004e3: file a.c, line 10.
(gdb) c
Continuing.

Breakpoint 2, main () at func.c:10
10 sum += i;
(gdb) p sum
$1 = 5050
可以看到设定断点只在i的值为101时触发,此时打印sum的值为5050。

忽略断点

#include <stdio.h>
int main(void)
{
    int i = 0;
    int sum = 0;
    for (i = 1; i <= 200; i++)
    {
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

在设置断点以后,可以忽略断点,命令是“ignore bnum count”:意思是接下来count次编号为bnum的断点触发都不会让程序中断,只有第count + 1次断点触发才会让程序中断。以上面程序为例:
(gdb) b 9
Breakpoint 1 at 0x4004e3: file hello.c, line 9.
(gdb) ignore 1 5
Will ignore next 5 crossings of breakpoint 1.
(gdb) r
Starting program: /root/play/hello
Breakpoint 1, main () at hello.c:9
9 sum += i;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6.x86_64
(gdb) p i
$1 = 6
可以看到设定忽略断点前5次触发后,第一次断点断住时,打印i的值是6。如果想让断点从i=1处开始生效,可以将count置为0:“ignore 1 0”.

linux之gdb调试常用100个技巧 linux之gdb调试常用100个技巧 https://gitlore.com/page/gitlore-git/gdb_tips/index.html 如果不懂linux gdb调试的 看下这篇文章 详细解说 阅读详情

相关推荐

100个gdb调试技巧-高清书签版

本书介绍了大量的gdb调试技巧,里面的技巧在开发过程中非常的实用,高清带书签版

GDB使用技巧和相关插件

参考:《100个gdb小技巧》链接中的文档有许多关于GDB的使用小技巧;gdb中使用“x”命令来打印内存的值,格式为“x/nfu addr”。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:a)n:输出单元的个数。b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)。

samli的博客 1973

100-gdb-tips:gdb技巧的集合。 100也许就意味着很多

《 100个gdb小技巧》 100,在这里可能只是表明很多;具体的多个连续您的参与和贡献。 在线阅读 如何参与 直接发PULL REQUEST,或与我们联系。 增加一个小技巧的步骤: 在src目录下添加一个md文件,参照现有文件的格式样式,编写一个小技巧markdown语法参见 md文件编写可以使用在线所见即所得编辑器 在index.md中为新md文件增加一个索引,可以放到已有分类中,或增加一个分类 如果预览下没有问题,OK! 本地生成html的步骤: 确保和已经安装并可用 直接运行build.sh 如果顺利,会在html目录下生成所有的html文件 联系方式 在线讨论问题:IRC,freenode,#hellogcc房间 (发信需要先订阅) 版权 本文档版权归贡献者所有。 授权许可 本文档使用的是。 致谢 各位与会者 其他资源

GDB调试100个小技巧

《100个gdb小技巧》 - hellogcc 挺有趣的一本关于GDB调试的文章, 看文章有时候调试会帮你省下不少事情, 例如: 设置被调试程序的参数 技巧 可以在gdb启动时,通过选项指定被调试程序的参数,例如: $ gdb -args ./a.out a b c 也可以在gdb中,通过命令来设置,例如: (gdb) set args a b c (gdb) show args Argument list to give program being debugged when it is starte

时有限 1440

100个gdb小技巧

一个关于gdb使用小技巧的文档。100,在这里可能只是表明很多;具体的数目取决于您的参与和贡献。

揭秘Outlook/QQ邮箱伪造:如何利用Unicode编码绕过SPF检测

本文深入剖析了利用Unicode编码进行邮件显示名伪造的攻击手法,揭示了攻击者如何通过插入零宽字符等特殊编码绕过SPF检测,使邮件在Outlook、QQ邮箱等客户端中看似来自可信发件人。文章通过Python代码示例演示了伪造过程,并提供了从用户自查到管理员部署DMARC策略的多层次防御建议。

weixin_29063035的博客 332

【亲测免费】 探秘GDB调试艺术:《100个GDB小技巧》

在软件开发的世界里,强大的调试工具是开发者们的得力助手。当遇到棘手的问题时,一份详尽且实用的调试指南就显得尤为重要。这就是我们今天要推荐的开源项目——《100个GDB小技巧》。这不仅是一个文档集合,更是一个充满智慧和技术热情的社区,帮助开发者们挖掘GDB的无限潜力。 ## 项目介绍 《100个GDB小技巧》是一份面向C/C++程序员的GDB使用教程,涵盖了各种实用的调试技巧和窍门。无论是初学者...

gitblog_00051的博客 693

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2970

gdb调试一百个小技巧

https://wizardforcel.gitbooks.io/100-gdb-tips/content/index.html

qq_38595432的博客 332

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 610

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 332

100个gdb小技巧项目

Hellogcc发起了一个项目:100个

一个手艺人的专栏 2258

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1688

避开SS524V100 GDB的坑

1. ./bfd: No such file or directory 2. SS524V100 GDB relocation error: symbol _ZTINSt13__future_base12_Result_baseE, version GLIBCXX_3.4.23 not defined in file libstdc++.so.6 with link time reference

m0_37383484的博客 970

OpenHarmony电源管理驱动架构剖析:HDI框架下的低功耗实现

鸿蒙电源管理驱动模块是OpenHarmony操作系统中负责设备电源状态管理的核心组件。该模块基于HDI(Hardware Device Interface)框架实现,提供了完整的电源管理功能,包括系统休眠/唤醒、运行锁管理、休眠模式控制等核心功能。public:// 主要接口函数// 运行锁管理private:// 内部辅助函数// 成员变量public:// 运行锁控制接口// 回调管理private:// 内部辅助函数。

m0_67505153的博客 208

基于语义分割的实时建图:HDMap动态更新

基于语义分割的实时建图:HDMap动态更新​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于语义分割的实时建图技术在HDMap动态更新中的应用展开,介绍了语义分割基础、HDMap概述、相关实时建图技术、动态更新关键技术、系统性能评估指标、实际应用案例、面临的挑战与解决方案及未来发展趋势。阐述了该技术如何利用传感器数据和语义分割算法,解决传统HDMap构建与更新的弊端,分析了其在精度、实时性、鲁棒性等方面的表现,以及在自动驾驶和智能交通中的应用,还探讨了现存问题及未来优化方向。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

用GDB调试程序(一)

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

陈皓专栏 【空谷幽兰,心如皓月】 66万+

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3926

转载:100个GDB小技巧

调整窗口大小 | 100个gdb小技巧

weixin_50150567的博客 193

计算机控制技术及应用

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

Camera2Demo

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

GDB图形化界面调试指南:100-gdb-tips TUI模式完全使用手册

GDB(GNU调试器)是开发者必备的调试工具,而TUI(文本用户界面)模式则为命令行调试提供了直观的图形化体验。本文将详细介绍100-gdb-tips项目中TUI模式的使用方法,帮助新手快速掌握图形化调试技巧。 ## 什么是GDB TUI模式? TUI模式是GDB提供的文本图形化界面,它将终端分为多个窗口,同时显示源代码、汇编、寄存器和命令行等信息,让调试过程更加直观高效。相比传统命令行调试,

gitblog_00982的博客 839

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

GDB提高调试效率的几个小技巧

一、反向调试 从7.0之后开始有这个功能,个人觉得,这个功能极大的增强了gdb调试的灵活性,我们不会再因为错过了某一个点而懊悔,但是这个功能也有自己的局限,只能在自己的控制范围内反向,如果出现了io,或者打印是无法反向的,世上没有真正的后悔药。 反向调试命令:record:开始记录;record stop: 结束记录;reverse-continue(rc): 反向执行,直到遇见中断事件;reverse-step(rs): 反向单步执行;reverse-stepi(rsi):...

weixin_39881935的博客 1907

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

gdb脚本

100个gdb小技巧 https://wizardforcel.gitbooks.io/100-gdb-tips/index.html 循环 set $seq=0 while ($seq < 32) set $seq++ end 宏定义 define dump_history set var $slab_id = $arg0 set va...

xiaoyulovly的专栏 501

gdb 小技巧

https://www.gitbook.com/book/wizardforcel/100-gdb-tips/details

weixin_33939380的博客 101

gdb-100-tips

gdb

sjc960115的博客 728

一、GDB在海思平台上的编译

编译环境 一、下载GDB压缩包 gdb-8.3.tar.gz 二、解压压缩包 tar xvf gdb-8.3.tar.gz 三、配置编译器 进入到GDB的文件目录,然后执行 ./configure --host=arm-himix100-linux --program-prefix=arm-hisi- --prefix=`pwd`/output 四、修改文件...

冷饮 1482

gdb输出日志记录

gdb日志记录 在实际工作中,常常会使用gdb命令,有时为了后续查看方便,可以将gdb的输出信息打印到特定文件中。 具体操作如下: (gdb) set logging file 设置文件名,文件默认生成在运行gdb命令的目录下; (gdb) set logging on 启动日志记录; (gdb) set height 0 这样gdb需要多行输出时,就会全部输出,中间不会暂停; (gdb) set print elements 0 这样gdb在打印时就没有默认为200个元素的长度限制; (gd

StarSky_Ye的博客 3315
上一篇: C语言-指针二三事
下一篇: C语言main函数argc argv介绍
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值