linux gdb调试

Linux gdb调试 阅读详情
常用的 gdb调试命令

gdb调试core文件: gdb -c core a.out
编译生成调试文件: gcc -o test test.cpp -g
[count]: 表示可选, count为行数

l [linenum] : list linenum行的代码;
l [+/-offset] : list当前行向下/向上offset行代码;
l [filename:linenum] : list filenmae文件linenum行代码;
l function: function函数

s[count]: step单行运行,有函数则进入函数;
info locals 打印当前变量

n[count]: next运行后面几行命令;

b <[linenum] 或 class::func>: 在linenum行或class::func函数处打断点;

delete [n]: 清除第n个断点;
clear: 清除刚才的断点;

disable breakpoints Num:关闭断点“Num”,使其无效,其中“Num”为 info breakpoints 中显示的对应值
enable breakpoints Num:打开断点“Num”,使其重新生效

bt: 栈;
frame n 调到n号栈

up/down [n] : 转到当前栈的上/下 n层栈;

info args: 当参数变量

info locals: 当前局部变量;

disassemble [func]: 输出当前[指定func]的汇编代码;

u: until 退出当前循环;


查看变量
p var: print打印var;
print var=10 : 修改值

指针处理
一般的指针直接用*解引用,但如果是stl这样的且包含自定义类型则必须把类型加上, 如下面:

// ObjIfno {Code c; Obj* obj;}是自定义类型
// 对于Obj* pObj; 这样的指针, 查看值如下:
p *(pObj)  // 可以直接解引用
//
//
// 如对于set<ObjInfo>::iterator itr 迭代器则该如下处理:
p *itr  // 这里不是C++, 如果直接*itr 是会报错:
//  "Attemp to take address of value not located in memory",
//   因为C++的*itr是调用了解引用操作函数, 这里这么做是错的
p itr   // ⇒ {_M_node = 0x7ff...} 即是一个结构体,里面有一个node成员
p itr._M_node   # ⇒ {std::_Rb_tree_tterator<ObjInfo>::_base_ptr} 0x7ff... ,
//  即_M_node是迭代器里的对象指针<ObjInfo>::_base_ptr, 
// 所以对该node解引用就可以得到对象
p *(itr._M_node)   /*⇒ 而这样解引用操作得到的只是红黑树的结构
 # {_M_color=std::_s_black, _M_parent=0x7ff..., _M_left=...,_M_right=...}
真正的解引用是加入对象类型*/
p *(ObjInfo*)itr._M_node       #⇒ {c = .., obj=...}
//同理得到Obj*
set $r = *(*(ObjInfo*)itr._M_node)
p $r.Obj   // ⇒ Obj*   

call func(参数):调用func,并传递“参数”,如:call gdb_test(55)
print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数

layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口

watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a

gdb初始化

如.vimrc文件一样在自己的主目录中加入.gdbinit文件,在该文件中加入一些初始化的命令:


 #
 # C++ related beautifiers
 #
set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on

下面的连接中是在.gdbinit文件中加入能打印stl元素的命令, 但我自己试了下好像没有用:
https://sourceware.org/ml/gdb/2008-02/msg00064/stl-views.gdb


Linux的gdb调试 Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。Debug 版本的生成:因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。所以debug版本的体积要大一些。gcc -c hello.c -g —> 生成包含调试信息的中间文件或者。 阅读详情

相关推荐

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

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

StackFrame 4475

gdb 调试stl

用gdb 调试如下代码时: map m; m[1] = 2; m[3] = 3; (gdb) p m[1] Attempt to take address of value not located in memory. (gdb) m.find

ferrarild的专栏 9157

告别拼音!用VSCode+Dosbox-X搞定汇编语言课程设计里的中文姓名显示

本文详细介绍了如何利用VSCode和Dosbox-X解决汇编语言课程设计中中文姓名显示的问题。通过配置开发环境、理解GB2312编码及正确使用汇编指令,学生可以告别拼音显示,实现中文字符的正确输出。文章还提供了完整的代码示例和常见问题排查方法,帮助读者快速掌握这一实用技能。

weixin_30872337的博客 425

使用gdb在linux命令行调试c++代码(1)

启动环境 gdb main 按行号打断点 break 7 按函数名打断点 break anyFunctionWithSourceCode 启动程序 run 带参数启动 run -c config.json 打印变量 print I_am_a_int 变量赋值 set I_am_a_int = 5 调用函数,打印返回值 print compute_sum(I_am_a_int , I_am_a_int) 如果报错 Cannot resolve function compute_

qq_41011242的博客 2155

SAP子公司财务账套配置实战:从公司代码到记账期间变式的关键步骤

本文详细介绍了为SAP子公司快速配置财务账套的实战步骤。通过复用母公司成熟配置,重点阐述了从创建公司代码、关联控制范围到分配记账期间变式的核心流程,帮助顾问在一两个小时内完成核心骨架搭建,实现高效集团财务管控。

cake8的博客 166

阿里云网络架构设计

背景 一个企业上云,首先要考虑整个网络的规划,涉及到云上和云下的网络规划,云上VPC的规划,云上不同地域VPC的互通,云上可用区的选择等等,所以一定要提前规划好整体的网络架构,现在阿里云云上的虚拟化网络解决方案已经完全转向 了云企业网,所以所有使用阿里云的企业客户多多少少都会使用阿里云的CEN 支撑自己的业务。 云企业网介绍 云企业网(Cloud Enterprise Network)是承载在阿里云提供的高性能、低延迟的私有全球网络上的一张高可用网络。 IDC专线接入CEN 首先面临的是云上和云下打通,那么

修电脑的码农 4841

C++的内存模型

说明: 主要内容参照自Working Draft, Standard for Programming Language C++ - N4810的6.6.1 Memory model小节。 同时,一些概念的描述也参照了cppreference.com - memory_model。 C++内存模型中的基本存储单元是字节。 一、字节: 字节是由连续的比特(bit)组成,其中比特的数量是...

Hi_douzi的博客 3680

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 400

指针和数组小记

DSAA in C 看到hash table的建立,对Figure5.8的程序中二级指针、一级指针和数组下标的用法有些疑惑,梳理一下指针和数组的关系。 写段代码看看: int main() { int a0 = 0; int a1 = 1; int a[2]; //a is the name of an int array, also a int const pointer a[0] ...

随便写写 370

pix4d安装步骤

pix4d三维模型软件的安装步骤

Little_Bee_27000的博客 1万+

离线安装WSL2系统

由于办公环境在内网环境中,需将开发环境部署到内网中。环境:内网:win10。

qq_40224400的博客 3512

gdb调试时好用的命令

set print pretty 我们在gdb调试时经常需要利用p命令打印结构体数据信息。默认情况下,p命令会以顺序罗列出来,这会显得很拥挤,不便于阅读。下面以一个实例进行说明。 实例代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAX_SENSOR_NAME_LEN 256

sy4331的博客 5485

NLTK中WordNet与同义词处理

通过本教程,学习了如何使用NLTK中的WordNet进行自然语言处理任务。首先介绍了WordNet的基本概念及其在NLTK中的集成使用,接着讲解了如何查找同义词、反义词等词汇关系,并结合实际应用演示了语义相似性计算。这些技能在文本分析、情感分析、信息检索等场景中有广泛应用,可以帮助开发者构建更智能的自然语言处理系统。掌握这些基本操作后,可以进一步探索WordNet的其他高级功能,结合其他NLTK工具进行更复杂的语言分析。

Mr数据杨 474

linux—常用gdb调试命令汇总

如果是函数递归调用,当还没开始递归时,finish会执行完整个函数,自动走完全部递归过程(前提无断点)。因为在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本。*gdp会自动记录最近的命令,如果没有输入其他命令,可以按enter键继续执行最近命令。需要注意的是,不能直接写变量名,变量编号使用infodisplay即可知道。如果我们需要在调试中一直显示某个变量的值,那么就需要display命令了。需要注意的是,这种方法只能显示一次变量值,当继续调试时变量不再显示。...

weixin_61857742的博客 2万+

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux之GDB调试

GDB 是一个开源的、功能强大的调试工具,主要用于调试 C、C++ 等语言编写的程序。它支持多种操作系统和架构,能够帮助开发者在程序运行过程中暂停执行、查看变量值、修改程序状态等,从而快速定位和修复问题。断点是调试过程中非常重要的工具,它可以让程序在指定的位置暂停执行,方便我们查看程序状态。当程序出现异常时,查看调用栈可以帮助你了解程序的执行路径。它会从当前栈帧开始,向上列出所有调用栈帧的信息,包括函数名、文件名、行号等。如果你在启动 GDB 时已经指定了程序参数,可以直接输入。

zzh_Zao的博客 4365

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux调试器gdb

前面我们介绍了gcc/g++的使用,我们知道在VS平台下编写代码是可以调试的,调试是我们经常使用的纠错手段,在Linux平台下也有相关的调试工具,那就是gdb,调试是我们必须掌握的技能,没有调试项目的错误就无法快速解决!​相信gdb的学习可以助力你在Linux相同上更顺利的构建大型工程,从容的面对各种bug,虽然在使用上与VS还有些差异,但是配合Linux上的其他工具一定可以使效率有一定的提升!

ARMCSKGT的博客 3733

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

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

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

m0_56069910的博客 4014

Linux GDB 调试指南

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

GitChat 4814

linux下的GDB远程调试

一、利用GDB进行远程调试,首先需要明确一下几点: 1、调试用的GDB必须是交叉编译产生的GDB; 2、调试的程序必须是交叉编译且带 “-g” 选项的可执行程序。 3、在宿主机和目标开发板上调试的必须是同一个可执行程序。 4、基于 3 ,我们必须要建立一个宿主机和开发板的NFS共享目录,以实现调试调试同一可执行程序。 5、目标开发板的gdbserver和宿主机用的GDB版本必须相同,最好

wendaotao的专栏 9256

【LINUX】调试器gdb详解

⭐⭐⭐。

2301_81772249的博客 1325

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

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

m0_52094687的博客 3943

Linux调试器gdb和cgdb的使用【Ubuntu】

执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,GDB 会暂。按下i键回到调试窗口,进入调试模式,使用的调试指令与GDB几乎一样!• 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上。• 上面的基本调试还是麻烦,虽然是黑屏,但是还是想看到代码调试。选项,如果没有添加,程序无法被编译。更改一下标志位,假设我们想得到。• 程序的发布方式有两种,出来的二进制程序,默认是。停程序的执行,并通知使用者。

小志的博客 2万+

linux下的gdb调试

在vs下程序有debug版本和release版本,debug版本方便程序员调试,release版本也就是发布版本,是供用户调试使用的。gcc/g++的可执行程序默认是release版本。上图代码是个简单的小程序,通过这个代码我们来测试一下gcc下编译后的可执行程序是否是release版本。通过使用makefile来进行编译debug版本则需要加“-g”也就是debug的最后一个字母。myexe的文件大小明显比myexe-debug文件大小要小readelf,elf大致意思是查看文件的格式.

. 1170

【Linux】gdb调试器的使用

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

m0_65679465的博客 7399

linux gdb 调试 权限,linux下GDB调试

linux下GDB是一个非常强大的调试工具,但是他不像vs一样具有强大的图形界面,基本都靠命令来进行调试,对于新手来说也算是个坎。下面就跟大家一起探究一下gdb这个强大的调试工具。1.开启core1.1 查看core是否开启$ulimit -c00:表示关闭,不会生成core文件;否则此值说明core文件的最大限制;1.2 打开开启core打开/etc/profile$sudo gedit /et...

weixin_31746149的博客 1373
上一篇: Xshell/vim颜色设置 修改hostname
下一篇: SetConsoleCtrlHandler
呵离
博客等级 码龄12年 18粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值