GDB调试总结

GDB源码移动后如何调试以及几种解决方法 发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行. gdb [exec file] [ core file] gdb之所以能够知道对应的源代码,是因为调试版的可执行程序中记录了源代码的位置; 因为源代码的位置在编译之后可能会移动到其它地方 所以gdb还会在当前目录中查找源代码 另外gdb也允许明确指定源代码的搜... 阅读详情

GDB调试总结

系统环境设置

被调试可执行文件编译

​ 编译是添加调试选项-g,以gcc/g++编译为例,如下:

gcc  -g  hello.c -o hello_test
g++  -g hello.cpp -o hello_test 

core文件设置

在启动的配置文件或者终端中执行如下命令

ulimit -c unlimited

如果要设置永久有效,可以修改/etc/security/limits.conf 文件, 找到 * soft core 0,修改为* soft core unlimited保存,这样每次启动时都会去读取这个配置文件。

#        - rtprio - max realtime priority
#        - chroot - change root to directory (Debian-specific)
#
#<domain>      <type>  <item>         <value>
#

*               soft    core            unlimited

基本命令

gdb常用启动参数说明

wangchenxi@2019-07-19|~$ gdb  --help
This is the GNU debugger.  Usage:

    gdb [options] [executable-file [core-file or process-id]]
    gdb [options] --args executable-file [inferior-arguments ...]

Selection of debuggee and its files:
# 指定可执行文件的参数
  --args             Arguments after executable-file are passed to inferior
  # 指定core文件路径
  --core=COREFILE    Analyze the core dump COREFILE.
  # 指定可执行文件路径
  --exec=EXECFILE    Use EXECFILE as the executable.
  # 指定程序pid
  --pid=PID          Attach to running process PID.
  # 指定源码路径
  --directory=DIR    Search for source files in DIR.
  ...
Initial commands and command files:
  --command=FILE, -x Execute GDB commands from FILE.

gdb基本调试命令

启动后设置启动参数

1、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

2、 运行环境。
path

可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。

3、工作目录。
cd

相当于shell的cd命令。
pwd 显示当前的所在目录。

4、dir :加一个源文件路径到当前路径的前面。指定多个路径,可以使用”:”
show dir:显示定义了的源文件搜索路径。

(gdb) dir /opt:/usr/include/
Source directories searched: /opt:/usr/include:$cdir:$cwd
(gdb) show dir
Source directories searched: /opt:/usr/include:$cdir:$cwd

5、set substitute-path
这个其实很好理解,就是替换规则,你如果想查看当前的替换规则,你可以

show substitute-path
比如此时我们需要qstring.cpp这个文件,但由于某种原因,目前我们不能在/home/rickyk/qt-4.8.6/src/corelib/tools/qstring.cpp中找到,但我们确可以在/home/rickyk/qt-everywhere-opensource-src-4.8.6/src/corelib/tools/qstring.cpp中找到,我们就

set substitute-path /home/rickyk/qt-4.8.6 /home/rickyk/qt-everywhere-opensource-src-4.8.6

这是什么意思?其实就是让gdb在看到/home/rickyk/qt-4.8.6的时候他会做自动替换成/home/rickyk/qt-everywhere-opensource-src.4.8.6,也就是说gdb可以正确知道这个文件了。此时我们再show substitute-path可以看到此时的转换规则已经被我们加进去了

gdb调试参数
run命令
开始执行被调试可执行程序
list 命令
简写 l
详情查看: (gdb) help l
Lines can be specified in these ways:
#直接跟数字 默认当前入口文件或这但前所在文件
# 如: l  50    # 表示从当前文件的50行开始,列出10行代码
  LINENUM, to list around that line in current file,
  
  # 查看指定文件的指定行号附近的代码
  FILE:LINENUM, to list around that line in that file,
  
  # 查看指定函数的代码,默认当前文件
  FUNCTION, to list around beginning of that function,

# 查看指定文件的指定函数代码
 FILE:FUNCTION, to distinguish among like-named static functions.

# 根据地址查看代码
*ADDRESS, to list around the line containing that address.

With two args, if one is empty, it stands for ten lines away from
the other arg.
break命令
简写 b  或  br
查看命令帮助:(gdb)  help  b
(gdb) help break
Set breakpoint at specified location.
# break  [探测类型]  [位置描述]  [线程描述]  [条件断点]
break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM] [if CONDITION]

PROBE_MODIFIER shall be present if the command is to be placed in a
probe point.  Accepted values are `-probe' (for a generic, automatically
guessed probe type), `-probe-stap' (for a SystemTap probe) or 
`-probe-dtrace' (for a DTrace probe).
LOCATION may be a linespec, address, or explicit location as described
below.
With no LOCATION, uses current execution address of the selected
stack frame.  This is useful for breaking on return to a stack frame.
THREADNUM is the number from "info threads".
CONDITION is a boolean expression.

# 位置描述
Linespecs are colon-separated lists of location parameters,
# 文件名、函数名、标签名、行号
such as source filename, function name, label name, and line number.
Example: To specify the start of a label named "the_top" in the
function "fact" in the file "factorial.c", use
"factorial.c:fact:the_top".
Address locations begin with "*" and specify an exact address in the
program.  Example: To specify the fourth byte past the start function
"main", use "*main + 4".

Explicit locations are similar to linespecs but use an option/argument
syntax to specify location parameters.
Example: To specify the start of the label named "the_top" in the
function "fact" in the file "factorial.c", use "-source factorial.c
-function fact -label the_top".

By default, a specified function is matched against the program's
functions in all scopes.  For C++, this means in all namespaces and
classes.  For Ada, this means in all packages.  E.g., in C++,
"func()" matches "A::func()", "A::B::func()", etc.  The
"-qualified" flag overrides this behavior, making GDB interpret the
specified name as a complete fully-qualified name instead.

Multiple breakpoints at one place are permitted, and useful if their
conditions are different.


watch命令
简写 
命令帮助 (gdb) help watch
Set a watchpoint for an expression.
# watch  [位置描述]   变量名
# 当被监听位置的变量名发生值改变的时候执行断点
Usage: watch [-l|-location] EXPRESSION
A watchpoint stops execution of your program whenever the value of
an expression changes.
If -l or -location is given, this evaluates EXPRESSION and watches
the memory to which it refers.

next命令
简写 n
命令帮助 (gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
# 以代码行为单位,执行下N行代码
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.


step命令
简写 s
命令帮助(gdb) help step
Step program until it reaches a different source line.
Usage: step [N]
# 以机器指令行为单位,向下执行N行(次),一般用来进入可函数代码,继续调试
Argument N means step N times (or till program stops for another reason).

finish命令
简写 不是f
命令帮助:(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
# 一般用来完成函数调用,返回
Upon return, the value returned is printed and put in the value history.


x命令
命令帮助(gdb) help x
# 查看内存指令
Examine memory: x/FMT ADDRESS.
# 例如 (gdb) x/2xb   address
# 表示 以16进制(x:表示16进制,同时支持 0表示八进制,d表示十进制,u表示无符号整形)的形式
# 从地址address向后
# 读取2(2表示数量)个
# 字节b(b表示字节bytes,h表示半字halfword(2bytes),w表示word(4bytes), g表示8bytes)
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
  t(binary), f(float), a(address), i(instruction), c(char), s(string)
  and z(hex, zero padded on the left).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.  If a negative number is specified, memory is
examined backward from the address.
Defaults for format and size letters are those previously used.
Default count is 1.  Default address is following last thing printed
with this command or "print".

bt命令
# 查看堆栈信息
(gdb) help bt
Print backtrace of all stack frames, or innermost COUNT frames.
With a negative argument, print outermost -COUNT frames.
Use of the 'full' qualifier also prints the values of the local variables.
Use of the 'no-filters' qualifier prohibits frame filters from executing
on this backtrace.

(gdb) help f
# 切换到指定的堆栈点
Select and print a stack frame.
With no argument, print the selected stack frame.  (See also "info frame").
An argument specifies the frame to select.
It can be a stack frame number or the address of the frame.


多线程调试命令

1、info threads:
  这条命令显示的是当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。
2、thread ID:
  切换到当前调试的线程为指定为ID的线程。
3、thread apply all command:
  让所有被调试的线程都执行command命令
4、thread apply ID1 ID2 … command:
  这条命令是让线程编号是ID1,ID2…等等的线程都执行command命令
5、set scheduler-locking off|on|step:
  在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让它运行。
  off:不锁定任何线程,所有线程都执行。
  on:只有当前被调试的线程会执行。
  step:阻止其他线程在当前线程单步调试的时候抢占当前线程。只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的。
6、show scheduler-locking:
  这条命令是为了查看当前锁定线程的模式。

查看线程

(gdb)  info  threads

线程切换

(gdb) thread ID

锁定线程

(gdb) set scheduler-locking  on

多进程调试命令

查看进程

(gdb) info  inferiors

进程跟踪

默认设置下, 在调试多进程程序时 GDB 只会调试主进程. 但是 GDB > V7.0 支持多进程的分别以及同时调试, 换句话说, GDB 可以同时调试多个程序. 只需要设置 follow-fork-mode (默认值 parent) 和 detach-on-fork (默认值 on )即可.

follow-fork-modedetach-on-fork说明
parenton只调试主进程(GDB默认)
childon只调试子进程
parentoff同时调试两个进程,gdb 跟主进程, 子进程 block 在 fork 位置
childoff同时调试两个进程, gdb 跟子进程, 主进程 block 在 fork 位置

引用说明

GDB c++ 调试 GDB c++ 调试程序编译1. 安装gcc (CentOS):2. 编译GDB debug1. 安装 gdb2. 进入调试环境3. 基本操作4. 设置断点 程序编译 首先,在debug之前要对程序进行编译,可以用 gcc 进行编译。 检查是否安装 gcc: rpm -qa | grep gcc 若没有gcc, 请先安装。 1. 安装gcc (CentOS): yum -y install gc... 阅读详情

相关推荐

【C++之GDB调试】GDB调试从入门到精通

GDB调试对于C/C++开发者非常重要。

lemaden520的博客 1993

GCC/G++调试添加编译选项-g作用与用法

reference: https://blog.youkuaiyun.com/tanrui519521/article/details/79867221 http://c.biancheng.net/view/8153.html为什么调试的时候需要编译选项中添加 -g默认编译生成的可执行文件是无法使用 gdb 来跟踪或调试的,因为可执行程序中没有可供 gdb 调试使用的特殊信息,为了将必要的调试信息整合到可执行文件中,我们便需要用到 -g 选项,这样生成的可执行程序,倘若出现问题,便可以使用 gdb 找出问题具体出现的

顺其自然~专栏 4602

《跨界杂谈》华为印象(五):高度集权的矩阵式架构

高度集权的矩阵式架构 “高度集权的矩阵式架构”不是官方术语。是笔者的一位同事非常经典的总结。解释这个句话还是有点困难的,笔者入职华为三年也没彻底搞明白,在这里只能尝试性的解释一下。 矩阵 我们先看一下“矩阵”。华为有两套部门职能体系,华为内部术语,叫实线部门和虚线部门。由实线与虚线部门交叉构成矩阵。大部分(但不是所有)华为员工都由两个部门(两个领导)进行管理。对员工而言,所谓的实线部

《云计算架构技术与实践》 2994

使用别人编译的动态库gdb,路径不匹配

命令将动态库路径替换为本地路径,使 GDB 能够正确找到动态库并在其中设置断点。但在调试过程中,如果你需要查看动态库的源代码,你需要确保你本地的源文件路径与动态库的源文件路径一致。如果你在调试时需要在动态库中打断点,但动态库的路径是别人的路径,可以使用 GDB 的。命令查看已加载的动态库列表,并记录下包含需要调试的代码的动态库的名称和路径。命令将动态库路径替换为你本地的路径。例如,假设动态库的名称为。命令将动态库路径替换为你本地的路径。命令将动态库的源文件路径添加到 GDB 的源文件搜索路径中。

荣耀与梦想来日方长 707

FoundationPose复现及Realsense应用

FoundationPose是一个统一的基础模型,用于6D对象姿态估计和跟踪,支持基于模型和无模型的设置。在测试时可以立即应用于未见过的新对象,无需微调,只要给出其CAD模型,或者捕获少量RGBD参考图像。得益于统一框架,下游姿态估计模块在两种3D模型设置中都是相同的,当没有CAD模型时,使用神经隐式表示进行高效的新视角合成。通过大规模合成训练,辅以大型语言模型(LLM)、一种基于transformer的新架构和对比学习公式,实现了强大的泛化能力。

m0_56661101的博客 1万+

WebVTT中的文本轨道(Text Tracks,TT)到底是什么鬼?

WebVTT,全称是The Web Video Text Tracks Format,意思是网络视频文本轨道格式。那么到底什么是文本轨道(Text Tracks)呢?这篇文章希望一探究竟。

码农1479的博客 1985

g++ 重要编译参数

定义 DEBUG宏 # 如果文件中有DEBUG宏部分的相关信息,用DDEBUG来选择开启或关闭DEBUG g++ -DDEBUG main.cpp对下面的main.cpp文件定义DEBUG之后,才会执行 #ifdef DEBUG后面的语句。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 1159

噪声整形与过采样实战:从N-bit ADC到DSM的SQNR优化指南

本文深入探讨了噪声整形与过采样技术在DSM(Delta-Sigma调制器)中的应用,重点分析了量化器位数(N)、滤波器阶数(L)和过采样率(OSR)对SQNR优化的影响。通过实战案例和参数协同优化策略,帮助工程师在音频处理和通信系统设计中实现更优的信号质量。

weixin_42561040的博客 339

GDB调试

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

小白的成长 1万+

Android12 适配 usb 触屏

在 Android 系统中,输入设备 IDC(Input Device Configuration)设备描述文件(.idc)是用于配置和定义输入设备行为和属性的文本文件。 该文件通常在`/system/usr/idc/` 或 `/vendor/usr/idc/`,具体位置因芯片厂商SDK而异。一般情况此类文件是预置到系统,开发者 root 权限才能修改这些文件。输入设备 IDC 设备描述文件在 Android 系统中起到了识别、配置、映射和定制输入设备的作用,使得系统能够准确解析和处理各种输入设备的事件,提

weixin_35723192的博客 1229

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 935

如何使用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的博客 6554

高性能优化的本质

在很早之前,处理器性能的提升一般是通过减小元器件的尺寸,增加元器件的数量,提高主频来实现,这也是摩尔定律所说的,但是由于功耗的影响,主频不能一直增加。后来,由于英伟达的GPU的并行计算的出现,逐渐打破摩尔定律,人们利用多核,SIMD,SIMT来处理大量相同计算的数据,这极大的提高了效率。计算机的算力得到了巨大的提升,但是并行是困难的,对于有数据依赖的程序来说,处理并行是一件及其困难的事,但对于一些简单的数学库的计算,并行的实现相对简单。

发狂的小花的博客 273

gdb调试总结

在 root用户下,就在/root目录, 在 home用户下就在/home目录下,定义一个.gdbinit文件即可,不存在可以新建一个。然后在文件里面写上gdb命令Apache Web Server 源码为例,源码目录里面有一个.gdbinit文件set $i = 0elseendendend# 省略部分代码。

u010185392的博客 1491

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 550

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++调试@认识GDB调试

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

xuchaoxin1375的博客 1366

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

GDB调试命令

GDB是Linux下常用的程序调试工具,主要用于排查语法和逻辑错误。

weixin_45888613的博客 903

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

GDB调试gdb

启动程序,可以按照自定义的要求随心所欲的运行程序可以让被调试的程序在所指定的断点处停住(断点可以是条件表达式)当程序被停住时,可以检查此时程序中所发生的的事可以改变程序,讲一个BUG产生的影响修正从而测试其他BUG带有动态库的程序如何调试?多线程如何调试?

surfaceyan的博客 1475

GDB调试命令以及GDB调试段错误

一、GDB的调试命令。 C语言是:cc -g tst.c -o tst;C++是g++ -g -o (生成的文件) file.cpp C++调试程序命令:gdb file 启动,罗列代码行数ist 1,break (行数),info break,run(r)调试运行,step(s)单步调试,查看变量 print(p) 变量名,查看堆栈式bt,继续调试continue(c),退出程序q 二、Core文件的产生 当linux程序在运行过程中挂掉的时候,可能就出现core文件。通过调试core文件就可..

cindywry的博客 905

gdb调试方法

(转载)gdb中汇编调试我觉得写的挺好! 原名 gdb相关(gdb十分钟教程) 本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者。 GDB是一个由GNU开源组织发布的、UNIX/

bobocheng的专栏 1万+
上一篇: nginx完全开发指南(第一章,nginx入门)
下一篇: mardown语法说明(记录使用)
Malloc_New
博客等级 码龄11年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值