gdb入坑记录

一直都听说gdb,但是一直没用,最近的项目是一个很大的工程,各个模块各司其职,根本不可能用IDE单步调试(编译生成makefile文件就要很长时间,第一次生成和make总共需要几十min)。我只需要关注其中的一个模块,关注的也是其中的几个函数。需要接手主要还是在代码写挫的时候,会产生core文件,此时要定位错误,光靠人眼debug是非常费力的。就第一次入手了gdb,做一个简单的记录吧。

最一开始主要接触的主要是debug这个core文件,比如我主要就是用的/home/map/gdb-7.9/bin/gdb /home/map/sug-as.online/bin/sug-as.1 core.sug-as.11567.1540804927第二个参数是可执行文件,第三个参数是core文件),这样就可以去查看出错的一些东西了,首先是bt定位到出错的那一片位置。(其实一般情况下这个时候我们就已经可以定位出错误了,因为它会告诉我们在哪个模块的哪个函数出错)

《gdb入坑记录》

f num 其中num是你想看的那个frame。

然后就可以p 一个变量查看变量的值了,注意如果时指针变量那么要加上*

我装了一个插件是pvector(安装比较简单,goolge一下很快就OK),就可以查看一些容器变量了,比如pvector result_array 或者 pvector result_array 0就是查看这个vector的第一个元素等等啊。

然后一个重要的命令就是info,可以查看寄存器的一些信息等等.

《gdb入坑记录》


上面我们说的都是在代码出core的时候,进行debug core。那我们可不可以debug一个正在运行的程序呢?当然是可以的。我们先ps查看到这个正在执行的代码的进程id即PID(一般我们就用ps -ef | grep sug-as)来查看这个PID,然后gdb attach PID进入调试程序。

《gdb入坑记录》

《gdb入坑记录》


再下面谈一下在Mac上使用gdb调试的记录。安装有这么几个坑:1. 必须用gdb为8.0.1的版本,brew切换版本的命令如下:brew switch gdb 8.0.1. 2. 需要在钥匙串里增加证书。 3.需要在~/.gdbinit上增加一句命令,直接echo "set startup-with-shell off" >> ~/.gdbinit就行。

lldb 很好用,查看vector这些不用装插件(装了好像有问题)

Ref

GDB调试(正在运行的程序)

用gdb调C++标准库

Mac使用gdb

https://wizardforcel.gitbooks.io/100-gdb-tips/print-STL-container.html

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注