# gdb调试定位

## 一、Core文件简介

gdb一般用于查看进程崩溃产生的core文件，Core文件其实就是内存的映像，当程序崩溃时，存储内存的响应信息，主要用于对程序进行调试。当程序崩溃时会产生core文件，其实准确的应该说是core dump文件，默认生成的位置与可执行程序位于同一目录下，文件名为core._\*_。

## 二、开启和关闭core文件的生成

```
# -c表示生成的core文件的大小，单位字节，unlimited表示不限制大小
ulimit -c unlimited
# 查看core文件是否打开
ulimit -a
```

## 三、查看core文件

当程序生成了core文件，就可以通过gdb来打开并定位问题：

```
 # 运行 “gdb 可执行文件 core文件”进入gdb命令行
 gdb relation-c2s_worker /home/core/core.81799.1551430888
```

```
# 在gdb命令行运行bt就可以定位到导致程序崩溃的原因和行数
(gdb) bt
#0  0x000000320c24812c in vfprintf () from /lib64/libc.so.6
#1  0x000000320c26fa52 in vsnprintf () from /lib64/libc.so.6
#2  0x0000000000444b10 in tbase::tlog::CTLog::log_i (this=0x1c3eb68, flag=<value optimized out>, log_level=3, 
    fmt=0x7fd4434de930 "[%-10s][%-4d][%-10s] failed to HandleTag, userId:%llu, targetId:%llu, ret:%d\n") at ../comm/tbase/tlog.cpp:472
#3  0x00007fd44323fb06 in c2s::processor::QueryFriendTagProcessor::Execute (this=<value optimized out>, pBaseMsg=0x1edd490)
    at /home/wangjun/code/miliao-2.0-relation/relation_c2s/src/processor/relation_processor_tag.cc:234
#4  0x00007fd4433acf67 in milink::syncframework::CWebappFlowMgr::Start (this=0x1c677b0, pMsg=0x1edd490) at src/webapp_flow_mgr.cc:205
#5  0x00007fd4433ad92d in milink::syncframework::CWebappFlowMgr::HandleInput (this=0x1c677b0, iFlowId=10, arg1=0x1c43c40, arg2=<value optimized out>) at src/webapp_flow_mgr.cc:178
#6  0x00007fd44323b515 in spp_handle_process (flow=10, arg1=0x1c43c40, arg2=0x1c3eb60) at /home/wangjun/code/miliao-2.0-relation/plib/webapp_syncframe_v2/include/spp_webapp_frame.h:151
#7  0x0000000000433f55 in spp::worker::CDefaultWorker::ator_recvdata_v2 (flow=10, arg1=0x1c43c40, arg2=0x1c3eb60) at defaultworker.cpp:597
#8  0x00000000004489b5 in tbase::tcommu::tshmcommu::CTShmCommu::poll (this=0x1c43b70, block=false) at ../comm/tbase/tshmcommu.cpp:838
#9  0x0000000000431f93 in spp::worker::CDefaultWorker::realrun (this=0x1c3eb60, argc=2, argv=0x7fff815e5fa8) at defaultworker.cpp:163
#10 0x0000000000431a79 in main (argc=2, argv=0x7fff815e5fa8) at main.cpp:55
```

从上面的错误可以看出是relation\_processor\_tag.cc文件的234行打印log的错误。经过排查是打印log时数据类型不匹配。%s对应上了long类型。导致的程序崩溃。

## 四、gdb常用调试命令

* start：用start命令开始执行程序
* n：单步执行
* b：打断点
* c：继续运行程序
* display：display b 表示将b的值显示出来
* i：info的缩写，可以显示所有的断点`i breakpoints`
* delete：每个断点都有一个编号，delete 3表示删除编号为3的这个断
