[zhuan]Linux下GDB调试跟踪工具

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

http://blog.163.com/qianshch@126/blog/static/48972522200971195543869/

 

 

公司给我一个很重要的任务——阅读大约十几万行的C语言代码,读懂后要画流程图并讲解。老总提示要在Linux下进行调试跟踪,才比较容易理解。于是,我上网搜了很多关于GDB的文章,认真阅读后受益匪浅。下面是对我今天学习内容的总结——主要是将GDB的命令做记录。

一、执行程序

1、run命令  可附带给程序的任何参数,包括标准输入输出说明符(<和> ) 和shell通配符等

2、set args 可修改发送给程序的参数,如set args -n

3、show args 可查看其参数的列表

4、backtrace(bt)为堆栈提供向后跟踪功能,产生一张列表,显示参数的调用情况

5、next(n)  不进入函数内部的单步执行

6、step(s)  进入函数内部的单步执行(5、6两个经常结合着用)

7、finish   退出函数内部并返回调用函数中;结束执行当前函数显示其返回值

8、call func  调用和执行一个函数func

9、path 可设置程序的运行路径:

    **show paths查看程序的运行路径

    **set environment varname [=var] 设置环境变量

    **show environment [varname]查看环境变量

10、cd  可以切换工作目录;

11、pwd  显示当前的所在目录

12、info  terminal   显示程序用到的终端模式;>重定向

13、调试运行中的程序:用ps aux查进程号,再gdb中使用attach pid(进程号)

二、数据的查看与赋值

  1、print命令 检查或赋予各个变量的值,显示被调试的语言中任何有效的表达式,可以包含对程序中函数的调用、数据结构和其他复杂对象、值的历史成分以及认为数组。

    **print base@ length:显示内存中在便利那个base之后的length个元素的值。

  2、whatis命令 识别数组或者变量的数据类型

  3、ptype命令 比whatis 强大,可提供一个结构体的定义

  4、set var 可为某个变量赋值

  5、list命令 显示源代码:

     **list linenum   显示程序第linenum行周围的源程序

     **list function   显示函数名为function的函数的源程序

     **list  显示当前行后面的源程序

     **list –显示当前行前面的源程序

     **set listsize num 设置一次显示源代码的行数为num行

     **show listsize 查看当前listsize的设置

     **list first,last  显示从first行到last行之间的源代码

 7、info命令 显示相应的信息:

     **info threads命令来查看正在运行程序中的线程信息

     **info args 打印出当前函数的参数名及其值

     **info locals打印出当前函数中所有的局部变量及其值

     **info catch打印出当前的函数中的异常处理信息

8、search命令 搜索源代码

     **forward-search search向前搜索满足search的源代码

     **reverse-search search 全部搜索满足search的源代码

三、断点及其管理

  1、break(br)可以在调试程序中设置断点,

    **break line-number使程序恰好在执行给定行之前停止

    **break function-name使程序恰好在进入指定的函数之前停止

    **break line| function if con 若con为真,程序到达指定行或者函数时停止

    **break routine-name 在指定例程的入口处设置断点

    **break +/-offset在当前行号的前面或后面的offset行停住

    **break *address在程序运行的内存地址处停住

    **break在下一条指令处停住

    **指定在某个文件file中设置断点break file:line-number| function –name

   2、continue(C)从断点中继续运行

   3、quit(q)命令退出程序

   4、断点的管理:

       **info break 显示当前gdb的断点信息

       **del (break) num删除指定的某个断点

       **disable(break) num 禁止使用某个断点

       **enable (break) num 允许使用某个断点

       **clean num 清除源文件中某一代码行上的所有断点

四、在gdb中暂停和恢复程序的运行

 暂停的方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(ThreadStops)。

1、设置观察点WatchPoint 观察某个表达式得知是否有变化,如果有马上停住程序的运行

   **watch为表达式设置一个观察点,一旦表达式值有变化时,马上停住程序

   **rwatch当表达是被读时,停住程序

   **awatch当表达式的值被读或写时,停住程序

   **info watchpoints列出当前所设置了的所有观察点

2、设置捕捉点CatchPoint可设置捕捉点来捕捉程序运行时的一些事件

    **throw 一个C++抛出的异常

   **catch 一个C++捕捉到的异常

   **exec 调用   系统调用exec时

   **fork 调用    系统调用fork时

   **vfork 调用   系统调用vfork时

   **load 或 load 载入   共享库(动态链接库)。

   **unload 或 unload     卸载共享库(动态链接库)。

   **Tcatch只设置一次捕捉点,当程序停住以后,对应点被自动删除

五、多线程的跟踪

1、查看当前运行的线程:info thread  其中前面的*表示该线程为当前跟踪的线程

2、切换跟踪线程:thread threadID  这里的线程ID是GDB自动分配的编号

3、进入线程执行任务所调用的函数

           如:下面的函数创建一个可以执行抓包调度任务的线程(调用函数pcapDispatch),这时如何跟踪到pcapDispatch函数呢?

    createThread(&myGlobals.device[i].pcapDispatchThreadId, pcapDispatch, (char*)((long)i)); 

 ****在createThread这一行设置断点   br 行号

 ****在pcapDispatch函数处设置断点  br pcapDispatch

然后当跟踪到createThread这一行时,通过命令n,便可以进入到pcapDispatch函数中。

这段时间经常对多线程程序进行跟踪,摸索出来了跟踪的方法。

 还有很多方面的内容,还需日后耐心学习掌握!

【nachos】山东大学操作系统课设实验nachos系统(1):线程初探 山东大学操作系统课设,nachos3.4 c++版本 实验1线程初探 阅读详情

相关推荐

离线安装vue脚手架,内网安装@vue/cli

公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta

Liberty_yes的博客 1万+

gdb 调试命令整理

GDB 调试 要进行调试程序首先要生成一个含有调试信息的执行程序命令如下: gcc(g++) -g -o 文件名 源文件.c(源文件.cpp)gcc(g++) -ggdb3 -o 文件名 源文件.c(源文件.cpp) 此时便会生成一个含有调试信息的可执行文件,然后便可以用 gdb调试这个程序了,进入调试程序命令,但是如果用 gdb调试一个未包含调试信息的可执行文件则会发生错误

静故了群动 959

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2096

Deepin安装c++调试工具GDB

联网运用sudo apt-get install gdb就可以了。 $ gdb -version GNU gdb (Debian 7.12-6) 7.12.0.20161007-git Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu...

mirana的专栏 2595

gdb 如何调试绑定一个线程

info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。 thread ID 切换当前调试的线程为指定ID的线程。 break thread_test.c:123 thread all 在所有线程中相应的行上设置断点 thread apply ID1 ID2 command 让一个或者多个线程执行

鸟欲高飞先振翅,人求上进先读书 2703

GDB 调试多进程或者多线程应用

GDBlinux 系统上常用的 c/c++ 调试工具, 功能十分强大. 对于较为复杂的系统, 比如多进程系统, 如何使用 GDB 调试呢? 考虑下面这个三进程系统 : 进程 ProcessChild 是 ProcessParent 的子进程, ProcessParentThread 又是 ProcParent 的子线程. 如何使用 GDB 调试 子进程 ProcessChild 或

omnispace的博客 1172

Linuxgdb调试多线程

我们这仍旧将gdb的基本操作在这罗列一下: •list(l)行号:显示源代码。一次显示10行 •list(l)函数名:列出某个函数的源代码 •r或run:运行程序 •s或step:进入函数调用 •breaktrace(bt):查看函数调用栈 •info(i) locals:查看当前栈帧局部变量的值 •info break :查看断点信息 •finish:执行到当前函数返回,然后...

Chenxi13 544

在VScode中调试程序 结果软件提示没有gdb.exe文件

在VScode中调试程序 结果软件提示没有gdb.exe文件需要的工具解决办法具体操作 需要的工具 MinGW 解决办法 利用之前给VSCode配置环境变量的MinGW来进行操作。 具体操作 之前参考了一篇博客给VSCode安装环境的时候,博主只是提到了在如下链接下载MinGW然后安装VSCode所需的头文件,并没有提到调试时的问题。 https://sourceforge.net/projects/mingw/ 如下图所示是当时为了解决类似于#include <stdio.h>在VSCo

Baymaxxxxx的博客 5811

GDB调试-从安装到使用

gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。对于一般的Linux桌面系统(例如,ubuntu、centos等),我们可以直接运行gdb调试程序。

ZBraveHeart的博客 6883

vscode关于gdb编译器导致的调试错误,及自动生成文件流程

为什么安装好mingw64后没检查出来?因为大部分博主都是告诉我们在cmd中检查:g++ --version或者gcc --version就可以了。但是调试代码是gdb来执行的,所以也必须检查gdb是否成功安装。我是因为公司加密锁对gdb文件加密导致未装成功,而g++\gcc却不在加密的范围而安装成功,导致程序能运行而无法进入调试。错误根本原因:无法调试一定和gdb有关,gdb是用来调试程序的,gdp肯定未安装成功或未正确配置!2. 生成tasks.json。

qq_45241855的博客 3475

gdb 多线程调试

http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html http://blogold.chinaunix.net/u3/94700/showart_2389432.html   &lt;推荐阅...

weixin_34401479的博客 268

Linux编程基础——GDB(设置断点)

启动GDB后,首先就是要设置断点,程序中断后才能调试。在gdb中,断点通常有三种形式: 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: break &lt;function&gt;    在进入指定函数时停住 break &lt;linenum&gt;    在指定行号停住。 bre...

weixin_34208283的博客 3019

GDB之(5)线程和进程调试

在操作系统的世界,尤其是在Linux这一广受欢迎的开源系统中,进程(Process)和线程(Thread)是两种基础且核心的执行单位,它们共同构建起了系统进行任务管理和调度的基石。为了理解二者的联系和区别,可以将进程想象为一个工厂,而线程则是工厂的工人。进程可以被看作是一个程序的运行实例。它拥有独立的内存空间、数据栈以及其他用于跟踪执行的辅助数据。每个进程至少有一个线程,即主线程,但可以包含更多的线程。在Linux中,创建进程通常通过系统调用fork()

梅花香自苦寒来,宝剑锋从磨砺出。 2268

linuxGDB的使用

gdb [参数] Filename• -help:列出所有参数,并作简单说明。s file:读出文件(file)的所有符号• -core-c 这的core是程序非法执行后core dump产生的文件-d 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径• -quiet-q 使用该参数不显示gdb的介绍和版权信息。

hpx12345678的博客 2081

linux gdb 调试多线程

最近遇到一个问题,一个进程启用了多线程,然后一个线程挂掉了,产生了coredump文件,但是gdb的实现无法跟踪到是哪一个线程,没办法只能重新跑一边,gdb当前进程,加入断点,看运行情况,步骤如下: 1、top 查看正在运行的程序; 2、启动gdb,attach 需要调试的进程pid; 3、加入断点,continue gdb; 4、然后运行到出问题的线程出了segment fault错误

qz_blog的博客 556

gdb调试工具】| 如何在多线程、多进程以及正在运行的程序下调试

2、生成core文件 测试源码 3、调式正在运行的程序 测试程序 4、调试多进程程序 测试程序 5、调试多线程程序

weixin_45926547的博客 2164

线程的查看以及利用gdb调试多线程

转载自:https://blog.csdn.net/zhangye3017/article/details/80382496 1. 线程的查看 首先创建两个线程: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include &l...

gochenguowei的博客 1120

linux ptrace 图文详解(八) gdb跟踪调试程序的子线程、子进程

本文介绍了gdb调试程序时,如何跟踪调试程序创建的子进程/子线程。

h_b__k的博客 986

GDB调试方法

文章目录启动GDB调试coredump的设置与调试常用命令列表部分命令详解break/binfo break以及断点的enable、disable和deleteprint/p 和 ptypethread及info threadwatch常用调试技巧使 print 打印显示完整多线程下锁定当前调试线程调试多进程 GDB最详细的文档请参考GDB Documentation。其中给出的关于GDB的简介非常精炼: The purpose of a debugger such as GDB is to allow

jiang_T的博客 3951

Linux gdb调试跟踪(快速入门)

GDB调试工具 gcc/g++编译器是我们写编译C/C++程序时离不开的编译工具gdb又是调试C/C++程序的利器 一、程序编译支持gdb 调试 C语言程序编译指令: gcc -g xxx.c -o xxx C++语言程序编译指令: g++ -g xxx.cpp -o xxx 参数g:支持gdb调试 二、使用gdb ...

程序客栈 514

linux之使用ptrace 跟踪多线程程序

1.ptrace 原型说明 #include long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);  在使用PTRACE_TRACEME参数时,跟踪多线程程序需要使用PTRACE_SETOPTIONS来设置ptrace相关属性。  PTRACE_SETOPTIONS 是将

云守护的专栏 5298
上一篇: first
下一篇: getopt(分析命令行参数)
quanquan902000
博客等级 码龄16年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值