基本操作 命令 说明 gdb exceFile 不带命令行参数 gdb -args execFile arg0 ... argn 带命令行参数 r 开始执行(run的简写)。...以后每次程序用到变量var,都会打印其值 undispay 取消跟踪显示 p var 打印变量var一次。...p是print的缩写 多进程/多线程 命令 说明 set follow-fork-mode child 设置fork之后跟踪子进程,而默认是父进程 info thread 查看当前调试进程的线程信息...这里的ID是上面info thread得到的 break file.c:100 thread all 设置一个针对所有线程的断点 打印STL 下载stl-views。...正在执行的gdb可以使用source ~/.gdbinit。
c++中我们经常会使用gdb来截获进程,进行单步调试然后打印出过程中的数据供分析。但是有时候在系统出并不能很好打印出std容器的数据。...在咨询了谷歌之后,发现了一个有用的帖子https://stackoverflow.com/questions/42896196/pretty-print-not-working-for-c-stl-list...以下这段用引用自该帖子: 很好地打印出数据结构是一些GDB扩展 机制的Python 代码的函数。GDB 手册中有一节介绍了GDB中的漂亮打印。...++漂亮的打印机。...在线手册有一个相当广泛的部分,关于用 Python编写你自己的 GDB 漂亮的打印机。 那么我使用以下命令看下是否gdb启动的时候加载了这个pretty-printer。
最新在使用gdb调试c++代码的时候,发现无法使用print命令直接打印vector对象,在网上查阅了很多资料之后,发现都是这么说的: 1)打印整个vector (gdb) p *(myVector...果然,在实际测试过程中,我们发现如下问题: 1)无法直接使用size()命令,如下所示: 这个可能与程序本身有关系,这里不再展开,如果想获取vector的个数,并且打印整个vector信息,可以直接参考...:stl-views-1.0.3.gdb,下载之后放到指定路径下,然后在启动gdb的时候,可以通过source引入该文件,支持很多常见的stl容器打印,非常方便: 2)使用@N无法打印第N个元素,...实际测试结果发现效果为:打印前N个元素,例如@2,会打印vector的第一个和第二个元素,如果要打印第N个元数据,我们可以通过如下两种方式: // 这两种方式,编号均从0开始 (gdb) p (myVector...当前测试的GDB版本为7.9.1,还不能直接用print命令打印vector 参考文档 https://sourceware.org/gdb/wiki/STLSupport?
什么请看使用寄存器呢 隐藏知识:对cpu 而言 每个变量存储寄存器上,寄存器存储变量地址 变量名本质是程序员给某块内存或寄存器起的易记名字 info args 打印函数参数 info locals 打印当前栈帧的局部变量...print variable_name 打印变量值 为什么反汇编(无调试信息) disassemble → 分析变量对应的寄存器 → 通过寄存器获取值 举例: 通过反汇编分析变量-寄存器关系 反汇编当前函数...其实没有那么容易 空指针: 疑问:gdb print 变量 只查看简单变量,遇到复杂的 查看stl 链表,红黑树 复杂结构?...GDB如何优化显示c++ STL数据结构的值 gdb配置打印STL容器脚本pretty printer 参考https://zhuanlan.zhihu.com/p/662099267 引用技术断言错误...: 请相信 gdb core 位置一定正确的,但是如何解决 需要业务十分了解 总结 gdb 通过堆栈信息确定core位置 和core相关参数,这个快速确定方向, 剩余全部对业务理解 本文重点:变量---
一、gdb调试容器或者智能指针的内容 有时候我们需要debug一些core文件或者程序,但是如果遇到STL容器,p打印出的是一些红黑树或者原始的数据机构,这给我们调试带来不必要的麻烦。...gdb 内置了 Python 支持,因此可以轻松编写一个函数来打印出任何 stl 结构的内容。gcc 4.5 已经提供所需的 python 脚本,以使 gdb 智能地处理 stl 数据结构。...https://gist.github.com/skyscribe/3978082像这个脚本提供了一些打印容器的宏,或者这里:http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views...-1.03.txt 有了这些宏,就可以打印出响应的容器 wget http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt cat dbinit_stl_views...在gdb调试的时候,使用source ~/.gdbinit加载这些宏操作。 如果你的gdb在运行当中,需要重启启用下,这些宏才生效。 阅读这些代码宏,也可以帮助你理解stl结构。
既然如此,我们就不得不了解一些查看各种类型变量的方法,以帮助我们进一步定位问题。...例如,打印基本类型,数组,字符数组等直接使用p 变量名即可: (gdb) p a $1 = 10 (gdb) p b $2 = {1, 2, 3, 5} (gdb) p c $3 = "hello,shouwang...按照特定格式打印变量 对于简单的数据,print默认的打印方式已经足够了,它会根据变量类型的格式打印出来,但是有时候这还不够,我们需要更多的格式控制。...语法如下: x/[n][f][u] addr 其中: n 表示要显示的内存单元数,默认值为1 f 表示要打印的格式,前面已经提到了格式控制字符 u 要打印的单元长度 addr 内存地址 单元类型常见有如下...或者去使能: disable display num #num为前面变量前的编号,不带num时去使能所有 查看寄存器内容 (gdb)info registers rax 0x0
(gdb)attach 小结 本节主要介绍了两种类型的GDB启动调试方式,分别是调试未运行的程序和已经运行的程序。对于什么样的程序能够进行调试也进行了简单说明。...例如,打印基本类型,数组,字符数组等直接使用p 变量名即可: (gdb) p a $1 = 10 (gdb) p b $2 = {1, 2, 3, 5} (gdb) p c $3 = "hello,shouwang...按照特定格式打印变量 对于简单的数据,print默认的打印方式已经足够了,它会根据变量类型的格式打印出来,但是有时候这还不够,我们需要更多的格式控制。...语法如下: x/[n][f][u] addr 其中: n 表示要显示的内存单元数,默认值为1 f 表示要打印的格式,前面已经提到了格式控制字符 u 要打印的单元长度 addr 内存地址 单元类型常见有如下...值,上面可以带或不带该值,如果不带num,则针对所有skip,如果带上了,则只针对某一个skip。
(gdb)attach 20829 总结 本文主要介绍了两种类型的GDB启动调试方式,分别是调试未运行的程序和已经运行的程序。对于什么样的程序能够进行调试也进行了简单说明。...例如,打印基本类型,数组,字符数组等直接使用p 变量名即可: (gdb) p a $1 = 10 (gdb) p b $2 = {1, 2, 3, 5} (gdb) p c $3 = "hello,shouwang...按照特定格式打印变量 对于简单的数据,print默认的打印方式已经足够了,它会根据变量类型的格式打印出来,但是有时候这还不够,我们需要更多的格式控制。...语法如下: x/[n][f][u] addr 其中: n 表示要显示的内存单元数,默认值为1 f 表示要打印的格式,前面已经提到了格式控制字符 u 要打印的单元长度 addr 内存地址 单元类型常见有如下...值,上面可以带或不带该值,如果不带num,则针对所有skip,如果带上了,则只针对某一个skip。
当BE出现进程Crash的时,都会将运行时的堆栈打印到be.out文件中,一般如下图所示: ? 但是由于这部分信息并不完整,只能大致的帮助定位到可能的SQL查询。...使用GDB打开CoreDump文件 gdb be/lib/palo_be core.13610 通常core文件会生成在BE进程的启动目录,但是如果额外配置过core-pattern,就得到对应的目录上找到对应的...通过查询栈索引到QueryID 打开之后,用bt命令展开堆栈,得到展开之后详细的堆栈信息 #0 0x00000000013957c6 in std::_Bit_reference::operator...我们可以看到,栈9上是doris::PlanFragmentExecutor的函数调用,所以通过f 9切换到栈9,并打印_query_id。...并不是我们真正需要的十六进制,所以还得继续通过GDB打印对应的十六进制的query_id。
更改缓冲类型 在上一篇中说到了一些默认的缓冲类型,例如: 指向终端设备的流是行缓冲的 标准错误是不带缓冲的 指向文件的流是全缓冲的 …… 那么这些默认的缓冲类型如何修改?...NULL,将其变成了不带缓冲,因此你运行后发现,printf的打印会立即显示在终端。...printf打印的日志没有输出 不知道你有没有遇到过这样的情况,准备调试某一个bug,发现每次运行到某个地方,打印就结束了,然后就挂了,让你误以为程序执行到打印的地方就结束了,然而有可能程序执行到后面,...只是由于打印是行缓冲的,导致部分打印没有出来,很可能就是你没有加上换行符打印而已。...这时候你可以设置为不带缓冲,或者关键位置fflush,或者打印记得加上换行符。 当然你还可以用GDB,参考《GDB调试指南》。
最后汇聚所有场景的打分信息。 二、问题复现 有一天,开发代码进行了灰度发布,隔一段时间会有个core文件。使用gdb打印了信息如下。...v消息20220602-170753 (2).jpg 把m_cvr2的内容进行了打印(因为容器元素很多,这里使用了gdb内置命令set logging on,将std out屏幕输出写份副本到文件名gdb.txt...作为对比,我们也打印了m_ctr和m_cvr容器) 可以看到这个m_cvr2的[场景id为258]的map没有clear成功。...截屏2022-06-02 下午5.44.51.png 四、总结 这类问题起因不是直观的,因为不是我们stl中容器的clear实现有bug,本质上我们没有很熟悉容器是非线程安全的特性。...所以总结一些使用std容器的一些准则, 并发使用不新增元素(这里元素如果是简单类型pld是允许的,而非pld类型,如string或者各种类结构体是不允许的) 使用前在同一线程进行预填充。
info frame 查看当前堆栈帧更详细的信息 print a 打印变量信息 print/x a 十六进制输出变量信息 print a + b 可以进行表达式计算 print $eax 显示某个寄存器的数据...w: 4字节; g: 8字节) set vairiable a = 100 可以修改变量的值 commands 指定到了特定断点后执行的命令序列 whatis buf 显示变量的类型 dump memory...gdb会从这个文件读取配置 cat ~/.gdb_history 呵呵,对于gdb时想要查看长的字符串老是显示不全,怎么半呢,gdb参看数组字符串时默认只是显示部分的数据,通过这个命令可以修改:...,GDB会显出函数的参数地址。...这个选项默认为off set print pretty on 如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮 set print union 设置显示结构体时
多项链接优化(包含对类型合并功能重写、函数体按需加载等)[Debug模式的Firefox内存消耗从15GB降到3.5GB,链接时间从1700秒降到350秒] Inter-procedural优化改进...(包含新的继承类型分析模型、直接调用转为非直接调用和本地符号别名等) Feedback优化(包含对c++内联函数性能分析的改进、函数排序等) 支持OpenMP 4.0[并行计算] C、C++、Fortran...增加date-time警告 GNAT切换到Ada2012 C/C++ 增加编译信息带颜色输出(-fdiagnostics-color=auto) 单指令多数据(SIMD)指令的无循环依赖断言 支持...7.7.1 (如果存在ncurses-devel包) 注: (所有的库都会被安装在$PREFEX_DIR里) 额外建议: 给特定用户安装 gdb的pretty-printer 用以友好打印...stdc++的stl容器 在执行 install.sh 脚本前安装 ncurses-devel 和 python-devel, 用于编译gdb和开启python功能 安装完成后,把[GCC源码目录]/
上一篇《不可不知的Linux中三种缓冲模式》中说到了三种缓冲类型,这一篇主要讲与缓冲相关的函数,这些函数可以修改默认的缓冲类型,及在实际中可能遇到的问题。...通过设置stdout(标准输出)的第二个参数为NULL,将其变成了不带缓冲,因此你运行后发现,printf的打印会立即显示在终端。...使用setvbuf可以精确的说明缓冲的类型,这里是使用mode来说明的,mode的值包括以下几个 _IOFBF 全缓冲 _IOLBUF 行缓冲 _IONBUF 无缓冲 如果指定一个不带缓冲的流,则忽略...然而有可能程序执行到后面,只是由于打印是行缓冲的,导致部分打印没有出来,很可能就是你没有加上换行符打印而已。 这时候你可以设置为不带缓冲,或者关键位置fflush,或者打印记得加上换行符。...当然你还可以用GDB《GDB调试入门,看这篇就够了!》 控制文件I/O的内核缓冲 在某些情况下,我们可能需要强制将内核缓冲区内的数据刷新至磁盘,而不必等待内核线程等待特定时间后才写入。
如下示例 commands 1 slient printf “i is %d\n”, i end 在触发断点1时打印变量i的值,slient是让GDB安静的触发断点,不要打印一些没用的信息。...backtrace [n]:backtrace(bt)命令打印当前调用栈的信息,n为可选参数,既可以是整数也可以是负数,表示只打印栈顶上n层的栈信息或栈底n层信息。...up [n]:向栈的上面移动n层 down [n]:向栈的下面移动n层 info frame:打印详细的栈信息,主要以程序的虚拟地址信息为主 info args:打印当前函数参数和对应值 info locals...:打印当前函数局部变量和对应值 查看源代码 在查看栈信息的同时,你可能会对源代码感兴趣,以帮助你更好的理解程序的来龙去脉(如果你用的是Emacs编辑器,这种需求就会大大减少,因为Emacs和GDB配合的非常好...ptype,ptype会展开所有类型定义,whatis则不会 打印表达式: print [/] :print(p)打印命令有两部分,可选的/表示输出格式
对于基础类型(int,float..),直接调用 sort(start,end) 即可,对于非基础类型的结构体,可以通过重载对象的 < 运算符或者提供一个比较函数。...= verPInt.end(); ++iter) { delete *iter; *iter = NULL; } return 0; } gdb 查看堆栈...按照快排原理,每次都是遍历所有值和一个中间值比较,小的放左边,大的放右边。从STL源代码可看出,std::sort() 在遍历比较时,是没有加边界保护的。...STL 源码 : /usr/include/c++/7/bits/stl_algo.h(具体目录) 深层次的坑 写测试代码时候,发现比较元素从 vector 改为 vector,...比较函数同样错误的写为 >=,运行程序并不会 core,但是打印比较好的数据,发现数据错了!!
detected *** double free or corruption (fasttop): 0x0000000000503010 *** 我们看到程序出现了一些问题,产生了一个core文件 我们用gdb...查看一下这个core文件 gdb main.out (gdb) core-file core.45393 (gdb) bt #0 0x0000003f0b02e2ed in raise () from.../include/c++/3.4.5/bits/stl_vector.h:256 #11 0x0000000000400d0a in main () at main.cpp:17 我们看到程序是从程序的第.../include/c++/3.4.5/bits/stl_vector.h:256 #11 0x0000000000400ea2 in main () at main.cpp:18 (gdb) 为什么把循环从一次改成两次就会出错了呢...我们进如果打印vcar里对象中_car的地址,会发现他们竟然是一样的 ?
Windows中VS code debug时无法查看C++ STL容器内容 本文阅读重点 < 1 Windows中VS code debug时无法查看C++ STL容器内容 1.1 而我相应的配置文件如下...我发现一个有效的解决方法,但在x64版本的Windows上安装MinGW时,虽然官方推荐MinGW版本的是x86_64的,但实践后发现如果选择安装 x86_64的, 很可能Debug时会无法看到STL容器...(vecotr、map等)的具体信息,看到的是相应的内存地址~ 故建议选 i686 (win32)的,然后安装步骤的下一步及后面的操作都按默认的来就好。...", "miDebuggerPath": "gdb", "setupCommands": [ { // Display...content in STL containers pretty "description": "Enable pretty-printing for gdb"
数组元素的打印 如果需要打印整个数组的内容,可以使用循环访问每个元素。...++ 一维数组的创建、初始化、访问、打印以及与 sizeof 运算符结合的应用。...通过定义"学生"类,设置姓名、学号和成绩等属性,再为类添加一些方法,如打印信息和计算平均分,我逐渐理解了OOP的实际应用价值。...这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。 调试工具是我的好帮手。...例如,使用gdb调试器让我能够逐行检查代码的执行过程,而现代的集成开发环境(IDE)如Visual Studio则提供了更直观的调试界面。
在启动调试设置断点观察之后,没有我们想要的信息怎么办呢?这个时候,就需要单步执行或者跳过当前断点继续执行等等。而本文所说的单步调试并非仅仅指单步执行,而是指在你的控制之下,按要求执行语句。...单步进入-step 对于上面的情况,如果我们想跟踪add函数内部的情况,可以使用step命令(可简写为s),它可以单步跟踪到函数内部,但前提是该函数有调试信息并且有源码信息。...printf("it will calc a + b\n"); (gdb) s #单步进入,但是并没有该函数的源文件信息 _IO_puts (str=0x4006b8 "it will...如果没有函数调用,s的作用与n的作用并无差别,仅仅是继续执行下一行。它后面也可以跟数字,表明要执行的次数。 当然它还有一个选项,用来设置当遇到没有调试信息的函数,s命令是否跳过该函数,而执行后面的。...值,上面可以带或不带该值,如果不带num,则针对所有skip,如果带上了,则只针对某一个skip。